从函数定义中引用GeneratorFunction实例

我想在实例化的GeneratorFunction上设置属性。 我想能够设置length属性作为一种方便,所以消费者可以得到多less值将被生成的想法。 例如:

 function* produceValues(someInput) { this.length = determineLength(someInput) yield // something } const gen = produceValues(input) console.log(gen.length) 

毫不奇怪,使用this并不是指实例,而是全局的。 JavaScript是否提供了访问实例化对象的方法?

不,不幸的是, this不适用于发生器函数作为方法使用,不能用作构造函数(它们是)。 所以你只能做

 function* _produceValues(someInput) { yield // something } function produceValues(someInput) { var res = _produceValues(someInput); res.input = someInput; // or res.length = … return res; } produceValues.prototype = Object.defineProperties(_produceValues.prototype, { length: { get() { return determineLength(this.input); } } }); const gen = produceValues(input); console.log(gen instanceof produceValues); console.log(gen.input); console.log(gen.length); 

我们也可以给这个疯狂的句法糖:

 function generatorClass(genFun) { function constructor(...args) { return Object.setPrototypeOf(genFun(...args), new.target.prototype); } constructor.prototype = genFun.prototype; return constructor; } class produceValues extends generatorClass(function*(someInput) { yield // something }) { constructor(someInput) { super(someInput); this.input = someInput; } get length() { return determineLength(this.input); } } 

但那么你将不得不使用const gen = new produceValues(input) 。 这将变得清楚,虽然gen是一个特殊的发生器实例具有额外的属性。

JavaScript是否提供了访问实例化对象的方法?

就我所能说的而言 – 将会更彻底地阅读规范 – 但总是:

 function* produceValues_(someInput) { yield determineLength(someInput); } function produceValues(someInput) { const gen = produceValues_(someInput); gen.length = gen.next(); return gen; }