簡體   English   中英

Javascript defineProperty和Object.keys返回困境

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM