我目前正在阅读有关Symbols and Iterators(ES6功能)的信息,并在其中遇到示例后,我试图使对象可迭代,以便可以使用for...of功能。从我检查过的一些示例/答案/本文中,在普通情况下看起来像这样:



let obj = {
  prop1: 5,
  prop2: 'test',
  prop3: new Date(),
  [Symbol.iterator]: () => ({
  items: obj.items,
  next: function next() {
    return {
        done: this.items.length === 0,
        value: this.items.shift()
      }
  }
  })
};
Object.defineProperty(obj, "items", {
  enumerable: false,
  get: function() {
      let props = [];
      for(let prop in this) if(this.hasOwnProperty(prop)) props.push(this[prop]);
      return props;
  }
});
for(let prop of obj) console.log(prop);





但是我发现在迭代器的items数组中手动​​列出对象属性的所有值很烦人。另外,使用Object.defineProperty感觉脏又乱。我有点想从link扩展示例。是否有一种更聪明/更简单的方法来在迭代器中获取对象的所有属性(而不是items: obj.items和相关的膨胀或手动列出items: [5, 'test', new Date()]之类的项目)?

最佳答案

您可以在符号迭代器中返回生成器,也许是:

[Symbol.iterator]:function*(){
    for(value of Object.values(this)){
      yield value;//may extend this to your needs
    }
 }


或您的情况:

[Symbol.iterator]:function*(){
  var i=1;
  while(this["prop"+i]){
      yield this["prop"+i];//may extend this to your needs
      i++;
  }
}


http://jsbin.com/zekunalusi/edit?console

08-17 03:34
查看更多