2016-03-12 3 views
2

В моем текущем JS-проекте у меня есть класса, который выглядит следующим образом:Javascript - Получить прототип вернуть генератор

function MyClass() { 
    this.prop1 = true; 
    this.prop2 = "Hello World"; 
    this.prop3 = "This is another String."; 
    this.prop4 = "Just another string here."; 
} 

Я хочу, чтобы иметь возможность перебирать строку, используя Generator. Я мог бы достичь этого, делая это:

function* createStringIteratorFromMyClass(myclass) { 
    yield myclass.prop2; 
    yield myclass.prop3; 
    yield myclass.prop4; 
} 

Теперь я могу перебрать строку, как это:

for(const str createStringIteratorFromMyClass(...)) { 
    // access str here 
} 

Это прекрасно работает, но я хотел бы добавить createStringIteratorFromMyClass к прототипу MyClass.

Что-то вроде этого:

MyClass.prototype.createStringIterator = function*() { 
    yield this.prop2; 
    yield this.prop3; 
    yield this.prop4; 
} 

На данный момент я получаю ошибку:

Unexpected token '*'. Expected an opening '(' before a function's parameter list.

Как я могу добавить функцию, которая возвращает генератор с прототипом моего класса?

ответ

1

Обычно, если вы хотите, чтобы экземпляр вашего класса был итерабельным, нет необходимости создавать дополнительную оболочку. Просто определите Symbol.iterator для класса:

function MyClass() { 
    this.prop1 = true; 
    this.prop2 = "Hello World"; 
    this.prop3 = "This is another String."; 
    this.prop4 = "Just another string here."; 
} 

MyClass.prototype[Symbol.iterator] = function*() { 
    yield this.prop2; 
    yield this.prop3; 
    yield this.prop4; 
} 

let x = new MyClass() 

for(const str of x) { 
    console.log(str); 
} 
+0

Но что, если я хочу иметь несколько разных итераторов? Как тот, который выполняет итерации поверх свойств строки и выполняет итерацию над целыми свойствами? – LastSecondsToLive

+0

@LastSecondsToLive: в этом случае ваш код в порядке. Какой транспилер вы используете? – georg

+0

http://tinyurl.com/honkvm4 – georg

Смежные вопросы