Как я сделал бы итератор из класса ES6 таким же образом как JS1.7 SomeClass.prototype.__iterator__ = function() {...}
синтаксис?
[РЕДАКТИРОВАНИЕ 16:00]
Следующие работы:
class SomeClass {
constructor() {
}
*[Symbol.iterator]() {
yield '1';
yield '2';
}
//*generator() {
//}
}
an_instance = new SomeClass();
for (let v of an_instance) {
console.log(v);
}
Флаги WebStorm *[Symbol.iterator]()
с 'именем функции, ожидаемым', предупреждая непосредственно после Астерикса, но иначе, это компилирует и хорошо работает с Traceur. (Обратите внимание, что WebStorm не генерирует ошибок для *generator()
.)
Создание объекта повторяемый средства этот объект назвали метод с Symbol.iterator
. Когда этот метод называют, он должен возвратить интерфейс, названный итератор .
Этот итератор должен иметь метод next
, который возвращает следующий результат. Этим результатом должен быть объект с value
свойство, которое обеспечивает следующее значение, и done
свойство, которое должно быть true
, когда больше нет результатов и false
иначе.
я также реализую итератор для класса, названного Matrix
, который все элементы будут колебаться от [1 110] до [1 111]. Я создам другой класс для этого итератора, названного MatrixIterator
.
class Matrix {
constructor(width, height) {
this.width = width;
this.height = height;
this.content = [];
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
this.content[y * width + x] = y * width + x;
}
}
}
get(x, y) {
return this.content[y * this.width + x];
}
[Symbol.iterator]() {
return new MatrixIterator(this);
}
}
class MatrixIterator {
constructor(matrix) {
this.x = 0;
this.y = 0;
this.matrix = matrix;
}
next() {
if (this.y == this.matrix.height) return {done: true};
let value = {
x: this.x,
y: this.y,
value: this.matrix.get(this.x, this.y)
};
this.x++;
if (this.x == this.matrix.width) {
this.x = 0;
this.y++;
}
return {value, done: false};
}
}
Уведомление, что Matrix
реализации итератор протокол путем определения Symbol.iterator
символ. В этом методе создается экземпляр [1 115], который берет this
, т.е. Matrix
экземпляр как параметр, и в MatrixIterator
, метод next
определяется. Мне особенно нравится этот способ реализовать итератор, потому что он ясно показывает итератор и реализация Symbol.iterator
.
, С другой стороны, нельзя также определить непосредственно Symbol.iterator
и вместо этого добавить функцию к [1 122] следующим образом:
Matrix.prototype[Symbol.iterator] = function() {
return new MatrixIterator(this);
};
let matrix = new Matrix(3, 2);
for (let e of matrix) {
console.log(e);
}