Javascript Symbol.iterator:获取所有对象';迭代器对象中的属性

Javascript Symbol.iterator:获取所有对象';迭代器对象中的属性,javascript,ecmascript-6,iterator,symbols,Javascript,Ecmascript 6,Iterator,Symbols,我目前正在阅读有关(ES6功能)的文章,在遇到一个示例之后,我正在尝试将对象设置为可编辑的,以便我可以使用for…of功能。从我检查过的几个例子/答案/文章来看,简单来说是这样的: 让obj={ prop1:5, 建议二:"测试",, prop3:新日期(), [符号.迭代器]:()=>({ 项目:obj.items, next:函数next(){ 返回{ 完成:this.items.length==0, 值:this.items.shift() } } }) }; Object.define

我目前正在阅读有关(ES6功能)的文章,在遇到一个示例之后,我正在尝试将对象设置为可编辑的,以便我可以使用
for…of
功能。从我检查过的几个例子/答案/文章来看,简单来说是这样的:

让obj={
prop1:5,
建议二:"测试",,
prop3:新日期(),
[符号.迭代器]:()=>({
项目:obj.items,
next:函数next(){
返回{
完成:this.items.length==0,
值:this.items.shift()
}
}
})
};
Object.defineProperty(obj,“项目”{
可枚举:false,
get:function(){
让props=[];
如果(this.hasOwnProperty(prop))props.push(this[prop]),则(让prop在这里输入);
返回道具;
}
});

for(让obj的道具)console.log(道具)
您不应该使用
items
getter,而应该在迭代器方法中创建数组。您还可以使用生成器语法创建迭代器,这要容易得多

但是实现你想要的最简单的方法是

let obj = {
  prop1: 5,
  prop2: 'test',
  prop3: new Date(),
  [Symbol.iterator]() { return Object.keys(this).map(k => this[k])[Symbol.iterator](); }
};

您不应该使用
items
getter,而应该在迭代器方法中创建数组。您还可以使用生成器语法创建迭代器,这要容易得多

但是实现你想要的最简单的方法是

let obj = {
  prop1: 5,
  prop2: 'test',
  prop3: new Date(),
  [Symbol.iterator]() { return Object.keys(this).map(k => this[k])[Symbol.iterator](); }
};

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

[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++;
  }
}

您可以在符号迭代器中返回一个生成器,可能:

[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++;
  }
}

函数对象条目(obj){
设指数=0;
//在ES6中,可以使用字符串或符号作为属性键,
//Reflect.ownKeys()检索这两个
让propKeys=Reflect.ownKeys(obj);
返回{
[符号.迭代器](){
归还这个;
},
下一个(){
如果(索引

函数对象条目(obj){
设指数=0;
//在ES6中,可以使用字符串或符号作为属性键,
//Reflect.ownKeys()检索这两个
让propKeys=Reflect.ownKeys(obj);
返回{
[符号.迭代器](){
归还这个;
},
下一个(){
如果(索引


为什么您认为需要一个
.items
getter属性来实现此目的?首先,我需要设置
enumerable:false
,以避免此属性本身出现在列表中;也可以使对象更干净。不要使对象变得不可编辑,这没有意义。相反,只需为(让prop在obj中)console.log(prop)编写
-这就是<代码>的作用…在<代码>中循环是好的!不,为什么你认为你需要
obj.items
呢?我需要它来获取迭代器方法的实际值数组。为什么你认为你需要一个
.items
getter属性呢?首先,我需要设置
enumerable:false
来避免这个属性本身出现在列表中;也可以使对象更干净。不要使对象变得不可编辑,这没有意义。相反,只需为(让prop在obj中)console.log(prop)编写
-这就是<代码>的作用…在<代码>中循环是好的!不,为什么你认为你需要
obj.items
呢?我需要它来获取迭代器方法的实际值数组。当
of
尝试迭代对象时,这会创建无限递归…@bergi哦,对了,object.values()是否使用迭代器(我希望不是)?这会起作用,
Object.values
枚举属性我尝试了第二种选择。它说,
Uncaught ReferenceError:retinatorruntime没有定义
对不起,它在jsbin上工作,但在codepen上失败,我测试它创建无限递归,因为
尝试迭代对象…@bergi哦,对了,object.values()使用迭代器了吗(我希望没有)?这可以工作,
Object.values
枚举属性我尝试了第二种选择。它说,
Uncaught ReferenceError:retinatorruntime没有定义
抱歉,它在jsbin上工作,但在codepen上失败,我在那里测试时,我用
for..of
尝试了这一点,得到了
对象。值(…)。值不是函数
错误。哦,对了,仍然是实验性的。我要更新一下,上面写着
未捕获类型错误:Object.keys(…).map(…).values不是一个函数
@curveball由于兼容性问题,浏览器显然落后于支持。幸运的是,相同的方法存在于不同的名称下:-)当我用
for..of
尝试此方法时,我得到了
Object.values(…)。values不是函数
错误。哦,对了,它仍然是实验性的。我要更新一下,上面写着
未捕获类型错误:Object.keys(…).map(…).values不是一个函数
@curveball由于兼容性问题,浏览器显然落后于支持。幸运的是,相同的方法存在于不同的名称下:-)