具有隐藏功能的Javascript对象?

时间:2012-12-24 21:24:24

标签: javascript function functional-programming

我想创建一个变量,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变量成为一个单独的实体?

1 个答案:

答案 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

希望有所帮助!