在tutorial中,它解释了如何使用户定义的迭代成为可能,
那么我们如何在我们自己的对象上实现可迭代协议?我们的确是 通过使用Symbol.iterator键定义方法。
鉴于它是方法的一部分,将[Symbol.iterator]
称为键是正确的吗?我的理解是,键只能是属性的一部分(属性由键和值组成),方法是在对象内部使用的函数。
作为参考,这是教程中的示例:
class UserCollection {
constructor(users) {
this.users = [].concat(users);
}
[Symbol.iterator]() {
let i = 0;
let users = this.users;
return {
next() {
if (i < users.length) {
return { done: false, value: users[i++] };
}
return { done: true };
}
};
}
}
答案 0 :(得分:4)
在ES6中,您可以使用[]
通过表达式定义方法名称。这样,您就可以创建计算出的方法名称(计算键)。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions
例如,以下各项均等效:
class Foo {
myMethod() {}
}
class Foo {
['my'+'Method']() {}
}
const m = 'myMethod';
class Foo {
[m]() {}
}
所有3个都创建了Foo.myMethod()
。
在您的情况下,[Symbol.iterator]
允许您获取iterator
符号,并将该符号分配为方法名称。
答案 1 :(得分:2)
我认为您对密钥,属性和方法这两个术语感到困惑。在javascript中,方法只是分配给属性的函数。例如:
obj = {
method() {}
}
类似于
obj = {
method: function() {
}
}
这种混淆来自于以下事实:上面的语法是简写形式,实际上只是ES6中引入的语法糖。直到那时,将匿名方法分配给属性是定义对象方法的唯一方法。因此,是的[Symbol.iterator]
是关键。因为
obj = {
[Symbol.iterator]() {}
}
几乎*与
相同obj = {
[Symbol.iterator]: function() {}
}
*几乎相同,因为速记还为该函数提供了与默认方法不同的toString()方法。如果在两种情况下都执行console.log(obj [Symbol.iterator]),则将得到[Symbol.iterator]() {}
和function() {}