Generator
Generator
Generator 객체는 generator 함수에 의해 반환되며 iterable 프로토콜과 iterator 프로토콜을 모두 충족한다. Generator는 Iterator 클래스의 하위 클래스이다.
본문
생성자(Constructor)
Generator 생성자에 대응하는 JavaScript 엔티티는 없다. Generator의 인스턴스는 generator 함수로부터 반환되어야 한다:
function* generator() {
yield 1;
yield 2;
yield 3;
}
const gen = generator(); // "Generator { }"
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3
generator 함수가 만든 모든 객체가 공유하는 숨겨진 프로토타입 객체가 하나만 있다. 이 객체는 클래스처럼 보이도록 종종 Generator.prototype으로 표기하지만, GeneratorFunction이 실제 JavaScript 엔티티이므로 실은 GeneratorFunction.prototype.prototype이라고 부르는 것이 더 적절하다. Generator 인스턴스의 프로토타입 체인을 이해하려면 GeneratorFunction.prototype.prototype을 참조하라.
인스턴스 속성(Instance properties)
Generator.prototype에 정의되며 모든 Generator 인스턴스가 공유한다.
Generator.prototype.constructor— 인스턴스 객체를 생성한 생성자 함수.Generator인스턴스의 초기 값은GeneratorFunction.prototype이다.
참고: Generator 객체는 자신을 만든 generator 함수에 대한 참조를 저장하지 않는다.
Generator.prototype[Symbol.toStringTag]—[Symbol.toStringTag]속성의 초기 값은 문자열"Generator".Object.prototype.toString()에서 사용된다.
인스턴스 메서드(Instance methods)
또한 부모 Iterator로부터 인스턴스 메서드를 상속받는다.
Generator.prototype.next()—yield표현식이 만들어낸 값을 반환한다.Generator.prototype.return()— generator 본문의 현재 일시 중지된 위치에return문이 삽입된 것처럼 동작한다. 이는 generator를 종료하며,try...finally블록과 함께 사용하면 generator가 정리 작업(cleanup)을 수행할 수 있게 한다.Generator.prototype.throw()— generator 본문의 현재 일시 중지된 위치에throw문이 삽입된 것처럼 동작한다. 이는 generator에 오류 상황을 알리고, 오류를 처리하거나 정리하고 스스로 닫을 수 있게 한다.
예제
무한 반복자(An infinite iterator)
generator 함수를 사용하면 값이 필요할 때까지 평가되지 않는다. 따라서 generator는 잠재적으로 무한한 데이터 구조를 정의할 수 있게 해 준다.
function* infinite() {
let index = 0;
while (true) {
yield index++;
}
}
const generator = infinite(); // "Generator { }"
console.log(generator.next().value); // 0
console.log(generator.next().value); // 1
console.log(generator.next().value); // 2
// …
명세(Specifications)
- ECMAScript® 2027 Language Specification — sec-generator-objects
브라우저 호환성
baseline 기준 2016년 9월부터 널리 사용 가능하다. 호환성 표는 JavaScript를 활성화해야 볼 수 있다.
참고 자료
function*function*표현식GeneratorFunction- Iteration protocols