2012-12-24 87 views
2

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

问题是我还希望属性成为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被设置吸气返回变量properties代替this.properties。因此properties直接进行编辑。也许有可能使getter的返回值与实际的properties变量分开吗?

+1

也许你想从getter返回一个新对象,一个'properties'视图? –

+0

我给它一个镜头,但问题依然存在。不错的主意,但! –

+0

如果不在'properties'对象上,'attr'应该放在哪里? – Bergi

回答

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

希望这有助于!