具有Object.defineProperty的getter是否可以访问该实例?

时间:2017-10-24 20:55:47

标签: javascript ecmascript-6 this defineproperty

假设有一个人:

const Person = function(fname, lname) {
    this.fname = fname;
    this.lname = lname;
};

我想用“名字”getter扩展其功能

Object.defineProperty(Person.prototype, 'name', {
  get: () => `${this.fname} ${this.lname}`
});

然而,这不起作用。 getter中的this不是调用它的实例原型:

const p = new Person('Taylor', 'Swift');
p.name // "undefined undefined"

相反,它是属性定义的范围:

fname = 'Someone';
lname = 'Else';
p.name // "Someone Else"

1 个答案:

答案 0 :(得分:1)

在撰写这个问题的过程中,答案显而易见。如果它可以帮助其他人,仍然发布。

Getter属性确实绑定到它们的宿主对象。

问题在于我正在使用箭头函数来获取getter。箭头函数没有自己的this,而是使用封闭执行上下文的this值。

这意味着为getter属性执行的bind无效。

例如:

const foo = () => this.document;
foo() // global document object
foo.call({document: 'na'}) // still global document object
const bar = foo.bind({document: 'na'});
bar(); // still global document object