返回非价值财产

时间:2014-04-10 22:36:57

标签: javascript getter-setter

在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 )函数?

2 个答案:

答案 0 :(得分:0)

不幸的是,JavaScript函数无法实现这一点。用户代码创建的所有JavaScript函数只能返回值,而不是引用(从ES6开始,浏览器中的代码也无法实现这一点。)

  

ReturnStatement 评估如下(粗体强调):

     
      
  1. 如果 Expression 不存在,请返回(return,undefined,empty)。
  2.   
  3. 让exprRef成为评估 Expression 的结果。
  4.   
  5. 返回(返回, GetValue( exprRef ,空)。
  6.   

唯一的方法是使用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);