JavaScript绑定方法不适用于getter属性

see*_*uit 9 javascript

试着这样做:

var c = {
  x: 'other context'
};

var o = {
  x: 'this context',
  get otherContext () {
    alert(this.x);
  }.bind(c)
};

o.otherContext;
Run Code Online (Sandbox Code Playgroud)

但我得到一个Syntax Error:

未捕获的SyntaxError:意外的令牌.

用例

您可能会问,为什么我可能想要改变吸气剂的背景.在这里引导我的用例涉及创建一个将检索DOM属性的辅助对象.帮助器是在另一个对象中定义的,该对象持有对我需要属性的DOM元素的引用.所以,这个辅助对象实际上只是一些DOM方法的代理,真的,我会这样做:

var ViewObject = function () {
  this.el = document.getElementById('id');

  var proxy = {
    ...
    get left() {
      return this.el.offsetLeft
    }.bind(this)
    ...
  };
};
Run Code Online (Sandbox Code Playgroud)

恕我直言,这是一个非常有效的用例.并且具有父对象的this上下文的一个将是有用的.(也许代理功能可能更合适?嗯......我没有想到这一点.仍然是吸气剂是ES5,代理是ES6,只有常青树和Edge 13+实现,我认为在ES5的范围内问题仍然很非常适用.)

有人可以给我一个合乎逻辑的解释(优先考虑规范)为什么改变吸气剂的上下文是非法的.

Mik*_*uck 12

问题是方法语法不使用函数表达式.这是一个定义的句法结构.

MethodDefinition [Yield]:

PropertyName [?Yield] ( StrictFormalParameters ) { FunctionBody }

GeneratorMethod [?Yield]

获取 PropertyName [?Yield] ( ) { FunctionBody }

set PropertyName [?Yield] ( PropertySetParameterList ) { FunctionBody }

PropertySetParameterList:

FormalParameter

由于它不是函数表达式,因此您无权访问函数方法或属性.

你可以完成你想要的Object.defineProperty.

var proxy = { ... };
Object.defineProperty(proxy, 'left', {
  get: function() {
    return this.el.offsetLeft;
  }.bind(this)
});
Run Code Online (Sandbox Code Playgroud)

  • ...不,我错了。我犯了一个错误。工作正常。 (2认同)