如何在JavaScript中迭代使用getter的对象

6
这里是对象定义:

var Vars = new function(){
    var that = this;
    this.assign = function(name) {
        var realValue = undefined;
        Object.defineProperty(that, name, {
            configurable: true,
            get: function() {
                //console.log("Get");    do something...
                return realValue; 
            },
            set: function(v) {
                //console.log("Set");    do something...
                realValue = v;
            }
        });
    }
    this.destroy = function(name) {
        return delete that[name];
    }
};

但我发现我无法按照我想要的方式遍历这个对象。
>> Vars.assign("key")
<- undefined
>> Vars.key = 1
<- 1
>> Vars.key
<- 1
>> for(var i in Vars){console.log(i);}
assign 
destroy 
<- undefined

我在迭代对象时如何访问“key”?

你需要加上 enumerable: true - abhishekkannojia
1个回答

6
你必须显式地在属性描述符中声明你的属性是可枚举的。默认值为false。这就是为什么使用for..in时不会得到它的原因。根据MDN的说法,for...in语句按任意顺序迭代对象的可枚举属性。对于每个不同的属性,都可以执行语句。
关于可枚举属性,如此处所述: enumerable 如果并且仅当此属性显示在相应对象的属性枚举期间才为true。默认值为false。

var Vars = new function(){
    var that = this;
    this.assign = function(name) {
        var realValue = undefined;
        Object.defineProperty(that, name, {
            configurable: true,
            // This is the missing line
            enumerable: true,
            get: function() {
                //console.log("Get");    do something...
                return realValue; 
            },
            set: function(v) {
                //console.log("Set");    do something...
                realValue = v;
            }
        });
    }
    this.destroy = function(name) {
        return delete that.Local[name];
    }
};
Vars.assign("key");
for(var i in Vars){console.log(i);}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接