2017-04-04 1 views
1

Ich möchte Eigenschaften für die instanziierte GeneratorFunktion festlegen. Ich möchte in der Lage sein, die length Eigenschaft als einen Komfort festzulegen, damit der Verbraucher eine Vorstellung davon bekommen kann, wie viele Werte erzeugt werden. Zum Beispiel:Referenz GeneratorFunction-Instanz aus der Funktionsdefinition

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

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

Wenig überraschend, this mit bezieht sich nicht auf die Instanz, sondern die global. Bietet JavaScript eine Möglichkeit, auf das instanziierte Objekt zuzugreifen?

+1

Ich habe gerade https://github.com/allenwb/ESideas/issues/9 eingereicht. Allerdings gibt es ein größeres Problem: Der Code in der Generator-Funktion beginnt nicht zu laufen, bis 'next()' zum ersten Mal aufgerufen wird, also wäre es zu spät, '.length' zu initialisieren – Bergi

Antwort

1

Nein, leider nicht, wie this Arbeiten für Generatorfunktion als Methoden verwendet werden, nicht als Konstruktoren verwendet werden (was sie sind). Also alles, was Sie tun können, ist

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); 

wir auch diese etwas verrückt syntaktische Zucker geben kann:

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); 
    } 
} 

aber dann musst du const gen = new produceValues(input) verwenden. Es wird jedoch klar, dass gen eine spezielle Generatorinstanz mit zusätzlichen Eigenschaften ist.

1

Bietet JavaScript eine Möglichkeit, auf das instanziierte Objekt zuzugreifen?

nicht so weit wie ich kann sagen - aber es gibt immer - wird die spec gründliche lesen:

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

function produceValues(someInput) { 
    const gen = produceValues_(someInput); 
    gen.length = gen.next(); 
    return gen; 
} 
Verwandte Themen