我想创建一个变量,foo.properties
返回{default:{x:undefined}}
。但是,您可能会注意到属性变量不能直接编辑,因此__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
将被直接编辑。也许可以使 getter 中的返回值与实际的properties
变量成为一个单独的实体?
答案 0 :(得分: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
希望有所帮助!