2016-10-13 71 views
0

我嘗試使用訪問器定義屬性時出錯。這裏是我的代碼Javascript設置和獲取方法錯誤

 
    var person = {}; 

    Object.defineProperty(person, 'birthYear', { 
     value: 1997, 
     writable: true, 
     enumerable: true, 
     configurable: false, 
     set: function (value) { 
      this.birthYear = value; 
     }, 
     get: function() { 
      return 'Birth year - ' + this.birthYear; 
     } 
    }); 

    console.log(person.birthYear); 

錯誤文本:無效的屬性描述符。不能同時指定訪問器和值或可寫屬性。

如果我不能定義集並獲得像這樣的方法我可以做到這一點?

+2

你會刪除'value',但你不想要'birthYear'獲取'this.birthYear'因爲那會產生無限的遞歸。您需要將值存儲在別處,例如在不同的屬性名稱或符號上或變量中。 –

+0

是否有理由在一個對象上定義屬性,而不是[原型](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype) –

+0

...和FYI,您可以使用Object.create'一步完成該對象的創建/定義。 –

回答

5

查看錯誤信息:

不能同時指定訪問器和一個值或可寫的屬性。

當您試圖編寫它時會發生什麼情況時,說明某個屬性是否可寫是沒有意義的。

所以刪除:

writable: true, 

你不能給它一個值時,當你讀它的值是動態計算的,因此將其刪除:

value: 1997, 

然後你會得到關於遞歸的錯誤,因爲每次您嘗試讀取person.birthYear時,您的getter函數都會嘗試讀取person.birthYear

因此將值存儲在別的地方。

var person = { _birthYear: 1997 }; 

Object.defineProperty(person, 'birthYear', { 
    enumerable: true, 
    configurable: false, 
    set: function (value) { 
     this._birthYear = value; 
    }, 
    get: function() { 
     return 'Birth year - ' + this._birthYear; 
    } 
}); 

console.log(person.birthYear);