2014-04-10 54 views
1

在JavaScript中,可以定義一個對象的屬性作爲一個getter/setter方法,而不僅僅是一個「普通」的價值:返回非值屬性

Object.defineProperty(obj, 'complex_property', { 
    get: function getter() { return this.protected; }, 
    set: function setter(value) { this.protected = value; } 
}); 

有什麼方法返回一個非沒有首先評估它的getter函數的對象的value屬性,以便這個(或類似的)是可能的?

obj.property = function(name) { return this.[ name ]; }; 

// Doesn't work: 
// ReferenceError: invalid assignment left-hand side 
obj.property('complex_property') = 5; 

最後一行有效讀取6 = 5 - 很明顯的錯誤 - 因爲this.complex_property首先計算,然後返回。將閉包與getter-setter屬性相結合是一種有效的方法來模擬「私有」屬性並驗證賦值而不必使用實際的get/set函數:現代javascript的一個更好的特性。如果有辦法返回一個未評估的getter/setter屬性,它會更好:有沒有我錯過的方法,或者它不可能?我們是否使用set(prop, value)功能卡住?

回答

0

不幸的是,這對於JavaScript函數來說是不可能的。所有由用戶代碼創建的JavaScript函數只能返回值,而不是引用(從ES6開始,瀏覽器中的代碼也無法實現)。

一個ReturnStatement如下(粗體我的重點)評估:

  1. 如果表達不存在,收益率(收益,不確定的,空的)。
  2. 讓exprRef是評估表達式的結果。
  3. Return(return,GetValue(exprRef,empty)。

這樣做的唯一方法是要麼使用set(property, value)功能或創建一個實際的制定者。

0

你可以得到一個屬性。那麼,至少是一個屬性描述符。它不漂亮。

var prop = Object.getOwnPropertyDescriptor(obj /* from question */, 'complex_property'); 
prop.set.call(obj, 5); 

編輯:

obj.property = function (name) { return Object.getOwnPropertyDescriptor(this, name); } 
obj.property('complex_property').set.call(obj, 5);