いいえ、残念ながら、発電機の機能のためのthis
作品は方法、ではないとして使用されるようコンストラクタとして使用することができます。
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)
を使用する必要があります:だからあなたが行うことができ、すべては我々はまた、このいくつかのクレイジーな構文砂糖を与えることができます
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);
です。しかし、gen
は追加のプロパティを持つ特別なジェネレータインスタンスであることは明らかです。
私はhttps://github.com/allenwb/ESideas/issues/9を提出しました。しかし、より大きな問題があります:ジェネレータ関数のコードは、 'next()'が最初に呼び出されるまで実行されないので、 '.length'を初期化するには遅すぎます。 – Bergi