2014-03-27 46 views
0
/** 
* @author paula 
*/ 
var myObj = {}; 
Object.defineProperty(myObj, "prop1", { 
      get: function(){return this._prop1;}, 
      set:function(value){this._prop1 = value;}, 
      enumerable:true}); 

Object.keys(myObj) // Note that returns ["prop1"] 
myObj.prop1 = "Hello"; // call set 
Object.keys(myObj); // Returns ["prop1", "_prop1"] 
myObj   // Object {prop1: "Hello", _prop1: "Hello"} 

我已經爲前提,以使用對象屬性來填充空的對象。 defineProperty。困難在於我只想創建一個屬性 - [「prop1」],並且在上面的示例中,基於Object.keys()返回的內容,它看起來像創建了兩個屬性 - [「prop1」,「_prop1」 ]。的Javascript defineProperty和Object.keys返回困境

問題:「prop1」是什麼名稱 - 屬性還是屬於僞屬性? 對「prop1」和「_prop1」使用name屬性是否正確?

我也試過這個解決方案:

var myObj1 = {}; 
Object.defineProperty(myObj1, "prop1", { 
      get: function(){return this.prop1;}, 
      set:function(value){this.prop1 = value;}, 
      enumerable:true}); 
myObj1.prop1= "Bye" 

,並得到這個錯誤:「的RangeError:最大調用堆棧大小超出」這也是引發,因爲集無限循環一遍又一遍地調用相同的代碼再次。我想知道是否有任何解決此「RangeError:最大調用堆棧...」的問題? (可能重複)。謝謝。

回答

4

Question: What is the name for "prop1" - is a property or it's kind of pseudo-property ? Is it correct to be used the name property for both "prop1" and "_prop1" ?

是的,都是性質。 prop1是一個訪問器屬性(與getters/setter),而_prop1數據屬性(簡單,可寫值)。

爲了解決你的問題,只是不使用存取器屬性:

Object.defineProperty(myObj, "prop1", { 
// value: undefined, 
    writable: true, 
    enumerable: true 
}); 

如果需要存取器屬性出於某種原因,該值存儲無論是在封閉的可變或在非枚舉「隱藏」屬性:

(function() { 
    var value; 
    Object.defineProperty(myObj, "prop1", { 
     get: function(){ return value; }, 
     set: function(v){ value = v; }, 
     enumerable:true 
    }); 
})(); 

Object.defineProperties(myObj, { 
    "_prop1": { 
     enumerable: false, 
     writable: true 
    }, 
    "prop1": { 
     get: function(){ return this._prop1; }, 
     set: function(value){ this._prop1 = value; }, 
     enumerable:true 
    } 
}); 
Object.keys(myObj) // ["prop1"] 
1

當你在二傳手做到這一點:

this._prop1 = value; 

正在創建的 「_prop1」 屬性。如果你不希望它是枚舉,定義它的方式:

Object.defineProperty(myObj, "_prop1", { enumerable:false });