存取器属性的 get/set 中 this 指向属性被访问/赋值时的实际目标对象,而非定义时作用域;箭头函数不可用,方法提取会丢失 this。

在 JavaScript 中,使用 Object.defineProperty 或类中的访问器属性(get / set)定义的存取描述符,其 get 和 set 方法被调用时,this 指向的是当前属性所在的对象(即属性被访问/赋值的目标对象),而不是定义描述符时的作用域或函数本身。
get/set 中的 this 指向当前操作的对象
这是最关键的一点:无论描述符是在哪个作用域中定义的,只要通过某个对象访问该属性,get 或 set 内部的 this 就是那个对象。
- 例如,在对象字面量中定义
get name(),访问obj.name时,this就是obj - 若将该对象赋值给另一个变量或作为参数传入函数,再访问属性,
this仍是原对象(不是新变量名) - 如果通过原型链继承了带访问器的属性,访问时
this是实际调用属性的那个实例对象,不是原型对象
注意 this 可能被显式改变
get 和 set 是普通函数,因此可通过 .call()、.apply() 或 .bind() 显式指定 this。但这种用法会绕过正常访问逻辑,需谨慎。
-
obj.name→this是obj -
Object.getOwnPropertyDescriptor(obj, 'name').get.call(otherObj)→this是otherObj - 绑定后:
const boundGet = obj.__lookupGetter__('name').bind(fakeCtx),再调用会以fakeCtx为this
箭头函数不能用作 get/set
访问器属性的 get 和 set 必须是普通函数(有自己 this 绑定能力)。箭头函数没有自己的 this,它会继承外层词法作用域的 this,导致行为不可控且不符合访问器语义。
- 错误写法:
get: () => this._value→this不指向目标对象,几乎总是出错 - 正确写法:
get() { return this._value }或get: function() { return this._value }
常见陷阱:方法提取后丢失 this
把访问器方法单独提取出来(如 const getName = obj.name)会导致 this 丢失 —— 因为此时不是“属性访问”,而是直接调用函数,this 会变成 undefined(严格模式)或全局对象(非严格模式)。
- 安全做法:用
bind绑定,或包装成箭头函数:const getName = () => obj.name - 更推荐:保持属性访问形式,避免提前解构访问器
- ES6 类中同理:
class C { get x() { return this._x } },const getX = c.x同样失效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











