gpt4 book ai didi

具有隐藏功能的 Javascript 对象?

转载 作者:行者123 更新时间:2023-11-30 06:36:36 24 4
gpt4 key购买 nike

我想创建一个变量,使 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 被直接编辑。也许可以使 getter 的返回值成为与实际 properties 变量不同的实体?

最佳答案

好吧,让我直截了本地说。您有一个返回 foo 范围内变量的 getter。并且您只想将 .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

希望对您有所帮助!

关于具有隐藏功能的 Javascript 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com