试着这样做:
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)