getter中this指向调用该属性的对象而非定义它的原型,如obj.prop触发时this为obj;直接访问parent.prototype.prop时this为parent.prototype;继承链中仍以原始访问对象为准。

当通过原型链访问一个 Getter 属性时,this 的指向取决于**调用该 Getter 时的当前对象(即属性访问的主语)**,而不是定义该 Getter 的原型对象本身。
Getter 中的 this 指向调用者对象
JavaScript 的 Getter 是函数,但它被“触发”时,引擎会以属性访问的左侧对象为 this 执行该函数。即使 Getter 定义在原型上,只要它是从某个实例上调用的,this 就是那个实例。
- 如果写
obj.prop,且prop是原型上的 Getter,则执行时this === obj - 如果写
Parent.prototype.prop(直接在原型上读取),则this === Parent.prototype - 如果通过
call/apply显式绑定,this就是传入的那个对象
常见误区:以为 this 指向原型
很多人误以为“定义在哪,this 就指向哪”,但 Getter 不是静态绑定的——它像普通方法一样遵循动态绑定规则。例如:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
const proto = {
get value() {
return this.x; // 这里的 this 是调用者,不是 proto
}
};
const obj = Object.create(proto);
obj.x = 42;
console.log(obj.value); // 42 → this 指向 obj
即使 value 在 proto 上,obj.value 触发时 this 仍是 obj,所以能读到 obj.x。
继承链中多层 Getter 的 this 行为
如果原型链上有多个层级定义了同名 Getter(比如子类覆盖父类 Getter),仍然只看**最终被调用的那个 Getter 所属的对象**,this 始终是发起访问的原始对象。
- 不会因为 Getter 在 A.prototype 上,就让
this变成 A.prototype - 也不会因中间有 B.prototype 继承自 A.prototype,而改变
this指向 - 只要
instance.prop访问,this就是instance(除非手动 bind/call)
实际应用建议
编写原型上的 Getter 时,应默认它会被任意派生实例调用,因此逻辑要兼容 this 是实例对象的情形:
- 避免在 Getter 内部硬编码依赖某个特定构造函数或原型
- 若需区分调用来源,可用
this.constructor或Object.getPrototypeOf(this) - 若想强制绑定上下文,可改用普通方法并显式传参,而非依赖
this
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










