2

我想创建一个foo.properties返回的变量{default:{x:undefined}}。但是,您可能会注意到 properties 变量不可直接编辑,因此__defineGetter__用于使其可读但不可写。

问题是,如果您愿意,我还希望属性成为getter的一部分,而不是属性变量的一部分。然而,当您foo.properties在控制台中输入时,它会返回{default:{x:undefined},attr:function(){ [native code] }}. 如何阻止 attr 与属性变量关联?

var foo = new (function(){
    var properties = {
        default:{
            x:undefined
        }
    };
    this.__defineGetter__('properties',(function(){return properties;}).bind(this));
    this.properties.attr = (function(attr,value){
        var attr = attr.split('.');
        var recursive = function(attr,output,value){
            if(attr.length>1){
                return recursive(attr.slice(1),output[attr[0]],value);
            }else{
                if(value!=undefined){output[attr[0]] = value;};
                return output[attr[0]];
            };
        };
        return recursive(attr,properties,value || undefined);
    }).bind(this)
});

谢谢!

编辑

我认为当this.properties.attr设置getter时返回变量properties代替this.properties. 因此properties直接被编辑。也许可以使getterproperties的返回值成为与实际变量分开的实体?

4

1 回答 1

0

好吧,让我直说吧。您有一个 getter,它返回 foo 范围内的变量。并且您只想将.attr属性添加到返回值,而不是更改 foo 范围内的变量?

如果这是正确的,那么你应该稍微不同地处理这个问题。您是正确的,它从 getter 返回值,这与变量相同。

所以,为了解决这个问题,我们首先需要克隆变量,分配.attr然后返回它。

这段代码可以解决问题:

var foo = new (function(){
    var properties = {
        default:{
            x:undefined
        }
    };
    this.__defineGetter__('properties',(function(){
      var temp = clone(properties);
      temp.attr = (function(attr,value){
            var attr = attr.split('.');
            var recursive = function(attr,output,value){
                if(attr.length>1){
                    return recursive(attr.slice(1),output[attr[0]],value);
                }else{
                    if(value!=undefined){output[attr[0]] = value;};
                    return output[attr[0]];
                };
            };
            return recursive(attr,properties,value || undefined);
        }).bind(this)
      return temp;
    }).bind(this));

});

function clone(obj){
    if(obj == null || typeof(obj) != 'object')
        return obj;

    var temp = obj.constructor();

    for(var key in obj)
        temp[key] = clone(obj[key]);
    return temp;
}

这是一个演示jsFiddle

希望有帮助!

于 2013-01-14T02:58:42.110 回答