【发布时间】:2017-12-19 12:22:13
【问题描述】:
我目前正在阅读有关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()] 这样的项目)?
【问题讨论】:
-
你为什么认为你需要一个
.itemsgetter 属性来做这个? -
好吧,首先,我需要设置
enumerable: false以避免此属性本身出现在列表中;也可以使物体更干净。 -
不要让对象可迭代,没有意义。相反,只需写
for (let prop in obj) console.log(prop);- 这就是for … in循环的好处! -
不,你为什么认为你需要
obj.items? -
我需要它来获取迭代器方法的实际值数组。
标签: javascript ecmascript-6 iterator symbols