클래스

9.1 클래스와 프로토타입

클래스

예제

// 예제 9-1 단순한 자바스크립트 클래스

// Range 객체를 반환하는 팩토리 함수
function range(from, to) {
	// Object.create()를 통해 프로토타입 객체를 상속하는 객체 생성
	// 프로토타입 객체는 이 함수의 프로퍼티로 저장
	// Range 객체에서 공유하는 메서드를 정의
	let r = Object.create(range.methods); // 인자를 프로퍼티 삼아 새 객체 생성

	// Range 객체의 시작점과 끝점을 저장
	// 이들은 이 객체의 고유한 프로퍼티며 상속 x
	r.from = from;
	r.to = to;

	// 마지막으로 새 객체를 반환
	return r;
}

// 이 프로토타입 객체는 Range 객체가 상속하는 메서드를 정의
range.methods = {
	// x가 범위 안에 있으면 true를 그렇지 않으면, false 반환
	// 이 메서드는 숫자, 텍스트, 날짜 범위에도 동작
	includes(x) {return this.from <= x && x <= this.to;},
	
	// 클래스 인스턴스를 이터러블로 만드는 제너레이터 함수
	// 이 기능은 숫자 범위에서만 동작
	*[symbol.iterator]() {
		for(let x = Math.ceil(this.from); x <= this.to; x++) yield x;
	},

	// 범위를 나타내는 문자열을 반환
	toString() {return "(" + this.from + "..." + this.to + ")";}
}

// Range 객체의 사용 예제
let r = range(1,3); // range 객체 생성
r.includes(2) // true : 2는 범위 내에 존재
r.toString() // "(1...3)"
[...r] // [1,2,3] -> 이터레이터를 통해 배열로 반환

range()

*[symbol.iterator]

range.methods