在使用 [Symbol.iterator] 的用户定义迭代中,[Symbol.iterator] 被称为什么?

Nat*_*lie 0 javascript

在解释如何使用户定义的可迭代的教程中,它说

那么我们如何在自己的对象上实现可迭代协议呢?我们通过定义一个带有 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 };
      }
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

Cla*_*ies 5

在 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]() {}
}
Run Code Online (Sandbox Code Playgroud)

所有 3 个都创建Foo.myMethod().

在您的情况下,[Symbol.iterator]允许您获取iterator符号,并将该符号指定为方法名称。