以下是我的演示版jsfiddle
:
class Animal {
constructor(...names) {
this.animals = names
}
*[Symbol.iterator]() {
for (let animal of this.animals) {
yield animal
}
}
}
var animals = new Animal('cat', 'dog', 'tiger');
for (let animal of animals) {
console.log(animal)
}

但是当我在Visual Studio中重写它时:
class Animal {
*[Symbol.iterator]() {
}
}
我收到此错误消息:
预期的标识符,字符串或数字
所以,我的问题:如何修复它?
答案 0 :(得分:1)
您无法使用class
语法定义生成器。这是将代码直接转换为实际运行的ES6。
class Animal {
constructor(...names) {
this.animals = names
}
}
// you could define the generator on the prototype here ...
// but make sure you read the second half of this answer
Animal.prototype[Symbol.iterator] = function* () {
for (let animal of this.animals) {
yield animal
}
}
var animals = new Animal('cat', 'dog', 'tiger');
for (let animal of animals) {
console.log(animal)
}
// cat
// dog
// tiger
但那不是你应该做的事情。 Symbol.iterator
只需要解析可迭代值 - Array.prototype.values将提供您需要的东西
class Animal {
constructor(...names) {
this.animals = names
}
[Symbol.iterator]() {
return this.animals.values()
}
}
var animals = new Animal('cat', 'dog', 'tiger');
for (let animal of animals) {
console.log(animal)
}
// cat
// dog
// tiger
你可以将迭代器定义为生成器,就像在OP中一样,但是你必须使用委托(yield*
)来获取行为你渴望 -
class Animal {
constructor(...names) {
this.animals = names
}
*[Symbol.iterator]() {
yield* this.animals
}
}
var animals = new Animal('cat', 'dog', 'tiger');
for (let animal of animals) {
console.log(animal)
}
// cat
// dog
// tiger