2012-05-22 22 views
1

我想創建一個對象。但我不明白爲什麼我的財產獲得者定居者不能簡單地致電this.bar。因爲這樣我的foo對象似乎最終有兩個屬性。使用Object.defineProperties給出兩個屬性

這是正確的還是我:使用錯誤的DefineProperties

    1. 缺少點

    bar屬性創建foo

    var foo = function() 
    { 
        Object.defineProperties(this, { 
         bar : { 
          get : function() {return this.barVal}, 
          set : function(value) { this.barVal = value}, 
          enumerable: true, 
          configurable: true 
         } 
        }) 
    }; 
    
    var o = new foo(); 
    o.bar = "Hello"; 
    console.log(JSON.stringify(o)); 
    
    //output {"bar":"Hello","barVal":"Hello"} 
    
  • 回答

    4

    JSON.stringify激活吸氣劑解決財產。你的二傳手設置了第二個屬性,所以你最終看到了兩個。你需要的是一種存儲foo.bar的「內部」值的方法,它不是ON foo本身。

    function Foo(){ 
        var secret = {}; 
        Object.defineProperties(this, { 
        bar: { 
         get: function(){ return secret.bar }, 
         set: function(v){ secret.bar = v }, 
         enumerable: true, 
         configurable: true 
        } 
        }); 
    } 
    
    
    var foo = new Foo; 
    foo.bar = 'Hello'; 
    console.log(JSON.stringify(foo)); 
    
    +0

    真有趣。所以defineProperties實際上只適用於非常複雜的對象?否則它會讓我感到過度殺傷。我只是想預先定義屬性(我習慣於C#,所以這是一個學習曲線) – JonWells

    +0

    如果你只是想設置一個值,那麼你可以簡單地執行'this.bar = value'。當您希望enumerable/configurable/writable爲false時,Object.defineProperty用於訪問器(set/get)或數據(value)。 – 2012-05-22 10:18:12

    +0

    也可以使用Object.defineProperty來更新現有的屬性。就像你想讓一個屬性不可枚舉一樣:'this.bar ='Hello'; Object.defineProperty(this,'bar',{enumerable:false});'會根據需要工作,保持現有值但修改可枚舉性。 – 2012-05-22 10:21:41

    2

    您正在創建兩個屬性,一個名爲「bar」,另一個名爲「barVal」。 「bar」由defineProperties調用創建,「barVal」由set函數中的this.barVal賦值創建。它們對於它們的枚舉屬性都有一個真正的值(你明確地將它設置爲varVal,賦值將它隱式地設置爲barVal),因此它們都被JSON.stringify列出。

    如果你的意圖是barVal爲不以JSON顯示或-在枚舉你可以明確的設置它的枚舉屬性設置爲false私人值進行處理:

    var foo = function() 
    { 
        Object.defineProperties(this, { 
         bar : { 
          get : function() {return this.barVal}, 
          set : function(value) { this.barVal = value}, 
          enumerable: true, 
          configurable: true 
         }, 
         barVal : { 
          value: undefined, 
          enumerable: false, writable: true, configurable: true 
         } 
        }) 
    }; 
    
    +0

    或者直接聲明barVal作爲函數foo的局部變量 – HBP