¿Cómo haría un iterador de una clase ES6 de la misma manera que JS1.7 SomeClass.prototype.__iterator__ = function() {...} sintaxis?
[EDITAR 16:00]
Los siguientes trabajos:
class SomeClass { constructor() { } *[Symbol.iterator]() { yield '1'; yield '2'; } //*generator() { //} } an_instance = new SomeClass(); for (let v of an_instance) { console.log(v); } WebStorm marca *[Symbol.iterator]() con una advertencia de 'nombre de función esperado' directamente después del asterisco, pero por lo demás, se compila y funciona bien con Traceur. (Tenga en cuenta que WebStorm no genera ningún error para *generator() .
Debe especificar la propiedad Symbol.iterator para SomeClass que devuelve iterador para instancias de clase. El iterador debe tener el método next() , que a su vez devuelve el objeto con los campos de value y done . Ejemplo simplificado:
function SomeClass() { this._data = [1,2,3,4]; } SomeClass.prototype[Symbol.iterator] = function() { var index = 0; var data = this._data; return { next: function() { return { value: data[++index], done: !(index in data) } } }; };O usando clases ES6 y funciones de flecha:
class SomeClass { constructor() { this._data = [1,2,3,4]; } [Symbol.iterator]() { var index = -1; var data = this._data; return { next: () => ({ value: data[++index], done: !(index in data) }) }; }; }Y uso:
var obj = new SomeClass(); for (var i of obj) { console.log(i) } En su pregunta actualizada, se dio cuenta del iterador de clase a través de la función del generador . Puede hacerlo, pero debe comprender que el iterador NO PUEDE SER un generador. En realidad, el iterador en es6 es cualquier objeto que tenga un método next() específico
Defina un método iterador adecuado. Por ejemplo:
class C { constructor() { this.a = [] } add(x) { this.a.push(x) } [Symbol.iterator]() { return this.a.values() } }Editar: Ejemplo de uso:
let c = new C c.add(1); c.add(2) for (let i of c) console.log(i)Aquí hay un ejemplo para iterar sobre una clase personalizada de matriz 2d en ES6
class Matrix { constructor() { this.matrix = [[1, 2, 9], [5, 3, 8], [4, 6, 7]]; } *[Symbol.iterator]() { for (let row of this.matrix) { for (let cell of row) { yield cell; } } } }El uso de tal clase sería
let matrix = new Matrix(); for (let cell of matrix) { console.log(cell) }que daría salida
1 2 9 5 3 8 4 6 7