在javascript中,可以将对象的属性定义为getter / setter而不仅仅是" plain"值:
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 :(得分:0)
不幸的是,JavaScript函数无法实现这一点。用户代码创建的所有JavaScript函数只能返回值,而不是引用(从ES6开始,浏览器中的代码也无法实现这一点。)
ReturnStatement 评估如下(粗体强调):
- 如果 Expression 不存在,请返回(return,undefined,empty)。
- 让exprRef成为评估 Expression 的结果。
- 返回(返回, GetValue( exprRef ),空)。
醇>
唯一的方法是使用set(property, value)
函数或创建实际的setter。
答案 1 :(得分: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);