let obj = {};
Object.defineProperty(obj, 'src', {get: () => 'hello'});
Object.defineProperty(obj, 'alias1', {get: () => this['src']});
Object.defineProperty(obj, 'alias2', {get: this['src']});
console.log(obj.src);
console.log(obj.alias1);
console.log(obj.alias2);
输出:
hello
undefined
undefined
我做错了什么?
答案 0 :(得分:2)
Arrow functions不会绑定您期望的相同this
。在您的情况下,this
引用全局对象。您可以通过将第二行更改为:
Object.defineProperty(obj, 'alias1', { get: () => { console.log(this) } }); // ==> Window
您需要将其更改为以下内容:
Object.defineProperty(obj, 'alias1', { get: () => obj.src });
Object.defineProperty(obj, 'alias2', { get: function () { return this.src } });
直播示例:
let obj = {};
Object.defineProperty(obj, 'src', {get: () => 'hello'});
Object.defineProperty(obj, 'alias1', {get: () => obj['src']});
Object.defineProperty(obj, 'alias2', {get: function () { return this.src }});
console.log(obj.src);
console.log(obj.alias1);
console.log(obj.alias2);
答案 1 :(得分:0)
this['src']
必须是
obj["src"]
甚至
this.obj["src"]
因为箭头函数中的上下文是在(在这种情况下为window
)中声明的上下文而不是它所属的对象。