簡體   English   中英

返回非值屬性

[英]Returning a non-value property

在javascript中,可以將對象的屬性定義為getter / setter而不是“ plain”值:

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

有什么方法可以返回對象的非值屬性,而無需先評估其getter函數,從而使該對象(或類似對象)成為可能?

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 )函數嗎?

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

ReturnStatement的評估如下(大膽強調):

  1. 如果不存在表達式 ,則返回(返回,未定義,為空)。
  2. 令exprRef為對Expression求值的結果。
  3. 返回(return, GetValue( exprRef ,為空)。

唯一的方法是使用set(property, value)函數或創建實際的setter。

您可以獲得財產。 好吧,至少是一個屬性描述符。 而且不是很漂亮。

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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