[英]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的評估如下(大膽強調):
- 如果不存在表達式 ,則返回(返回,未定義,為空)。
- 令exprRef為對Expression求值的結果。
- 返回(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.