作者:嘻嘻2502891803 | 来源:互联网 | 2023-05-20 12:39
我将如何以与JS1.7 SomeClass.prototype.__iterator__ = function() {...}
语法相同的方式从ES6类中创建迭代器?
[编辑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]()
在asterix后面直接显示"函数名称预期"警告,但是否则会编译并与Traceur一起运行.(注意WebStorm不会生成任何错误*generator()
.)
1> alexpods..:
您需要指定Symbol.iterator
为其SomeClass
返回类实例的迭代器的属性.迭代器必须有next()
方法,女巫反过来返回对象done
和value
字段.简化示例:
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) }
}
};
};
或者使用ES6类和箭头函数:
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) })
};
};
}
用法:
var obj = new SomeClass();
for (var i of obj) { console.log(i) }
在您更新的问题中,您通过生成器函数实现了类迭代器.你可以这样做,但你必须明白迭代器可能不是一个生成器.实际上es6中的迭代器是具有特定方法的任何对象next()
2> Andreas Ross..:
定义合适的迭代器方法.例如:
class C {
constructor() { this.a = [] }
add(x) { this.a.push(x) }
[Symbol.iterator]() { return this.a.values() }
}
编辑:示例使用:
let c = new C
c.add(1); c.add(2)
for (let i of c) console.log(i)
这个特殊的例子没有使用发电机.它只是委托给一个数组迭代器.
@timkay您可能无法使用它,因为在大多数实现中,数组[仍然没有.values()方法](/sf/ask/17360801/)。使用`this.a [Symbol.iterator]()`代替
3> Shaheen Ghia..:
这是在ES6中迭代2d矩阵自定义类的示例
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;
}
}
}
}
这类课程的用法是
let matrix = new Matrix();
for (let cell of matrix) {
console.log(cell)
}
哪个会输出
1
2
9
5
3
8
4
6
7
你可以使用`for ... of` loops来简化迭代器:`for(let this of this.matrix){for(let cell of row){yield cell; }
4> ekillaby..:
文档:迭代协议
实现迭代器协议和可迭代协议技术的示例类:
class MyCollection {
constructor(elements) {
if (!Array.isArray(elements))
throw new Error('Parameter to constructor must be array');
this.elements = elements;
}
// Implement "iterator protocol"
*iterator() {
for (let key in this.elements) {
var value = this.elements[key];
yield value;
}
}
// Implement "iterable protocol"
[Symbol.iterator]() {
return this.iterator();
}
}
使用任一技术访问元素:
var myCollection = new MyCollection(['foo', 'bar', 'bah', 'bat']);
// Access elements of the collection using iterable
for (let element of myCollection)
console.log('element via "iterable": ' + element);
// Access elements of the collection using iterator
var iterator = myCollection.iterator();
while (element = iterator.next().value)
console.log('element via "iterator": ' + element);