Как сделать итератор из класса ES6

Как я сделал бы итератор из класса 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().)

57
задан 26 February 2015 в 19:31

1 ответ

Объяснению

Создание объекта повторяемый средства этот объект назвали метод с 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);
}
1
ответ дан 1 November 2019 в 16:36

Другие вопросы по тегам:

Похожие вопросы: