![](/img/trans.png)
[英]Javascript Object.keys(arr).reduce() return lowest key
[英]Javascript defineProperty and Object.keys return dilemma
/**
* @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()返回的內容,看起來好像創建了2個屬性-[“ prop1”,“ _prop1” ]。
問題 :“ prop1”的名稱是什么?是屬性還是偽屬性? 將name屬性同時用於“ prop1”和“ _prop1”是否正確?
我也嘗試過這種解決方案:
var myObj1 = {};
Object.defineProperty(myObj1, "prop1", {
get: function(){return this.prop1;},
set:function(value){this.prop1 = value;},
enumerable:true});
myObj1.prop1= "Bye"
並收到此錯誤: “ RangeError:超出最大調用堆棧大小” ,這是由於set在無限循環中一次又一次地調用相同的代碼而觸發的。 我想知道是否有任何解決此“ RangeError:最大調用堆棧...”問題 ? (可能重復)。 謝謝。
問題:“ prop1”的名稱是什么-是屬性還是偽屬性? 將name屬性同時用於“ prop1”和“ _prop1”是否正確?
是的,兩者都是屬性。 prop1
是訪問器屬性 (具有getters / setter),而_prop1
是數據屬性 (簡單的可寫值)。
要解決您的問題,只需不使用accessor屬性:
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"]
當您在設置器中執行此操作時:
this._prop1 = value;
您正在創建“ _prop1”屬性。 如果您不希望它是可枚舉的,則可以這樣定義:
Object.defineProperty(myObj, "_prop1", { enumerable:false });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.