2012-12-24 85 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

希望這有助於!