2017-04-04 12 views
1

インスタンス化されたGeneratorFunctionにプロパティを設定したいとします。便宜的にlengthプロパティを設定したいので、消費者は生成される値の数を知ることができます。たとえば:参照関数定義内のGeneratorFunctionインスタンス

function* produceValues(someInput) { 
    this.length = determineLength(someInput) 
    yield // something 
} 

const gen = produceValues(input) 
console.log(gen.length) 

当然のことながら、thisを使用してインスタンスを参照するが、代わりにグローバルません。 JavaScriptは、インスタンス化されたオブジェクトにアクセスするための何らかの方法を提供していますか?

+1

私はhttps://github.com/allenwb/ESideas/issues/9を提出しました。しかし、より大きな問題があります:ジェネレータ関数のコードは、 'next()'が最初に呼び出されるまで実行されないので、 '.length'を初期化するには遅すぎます。 – Bergi

答えて

1

いいえ、残念ながら、発電機の機能のための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は追加のプロパティを持つ特別なジェネレータインスタンスであることは明らかです。

1

JavaScriptはインスタンス化されたオブジェクトにアクセスする方法を提供していますか?私の知る限り

ない - より徹底的にスペックを読み込みます - が、常にあります:

function* produceValues_(someInput) { 
    yield determineLength(someInput); 
} 

function produceValues(someInput) { 
    const gen = produceValues_(someInput); 
    gen.length = gen.next(); 
    return gen; 
} 
関連する問題