-1

考虑在 上定义的这个简单的生成器函数Object.prototype

Object.prototype.defineProperty(Object.prototype, 'pairs', {
    enumerable: false,
    * value( ) {
        for (const key in this)
            yield [ key, this[key] ];
} });

当然,也可以这样使用:

const object = { goats_teleported: 42 };

for (const [ key, value ] of object.pairs());

但是我想知道是否有任何方法可以将pairs函数分配给对象原型,因此它将在for-of循环中自动触发而无需显式调用;像这样:

for (const [ key, value ] of object);

有任何想法吗?

4

3 回答 3

2
   Object.prototoype[Symbol.iterator] = function* pairs() {
     //...
   };

但请注意,这可能会在任何地方造成副作用。这不应该在生产中使用(或者至少,您自己承担风险;))。

于 2019-04-28T20:38:44.820 回答
2

把发电机放在Object.prototype[Symbol.iterator]

Object.prototype[Symbol.iterator] = function* pairs() {
  for (const key in this) yield [ key, this[key] ];
};
const object = { goats_teleported: 42, foo: 'fooval' };

for (const [ k, v ] of object) {
  console.log(k, v);
}

于 2019-04-28T20:38:54.763 回答
1

在 ES6 中,您可以使用Symbol.iterator为原型定义自定义迭代器。看这里

于 2019-04-28T20:43:24.970 回答