如何在JS中定义属性别名?

时间:2018-06-07 16:42:17

标签: javascript node.js ecmascript-6

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

我做错了什么?

2 个答案:

答案 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)中声明的上下文而不是它所属的对象。