原型对象方法中的 this 指向调用该方法的实例对象,与方法定义位置无关;无论方法在实例、原型或原型链上游,只要通过 obj.method() 调用,this 就绑定 obj;常见丢失 this 的情况包括赋值后独立调用或传入回调,需用 bind、箭头函数等修复。

原型对象方法里的 this 指向调用该方法的那个实例对象,不是原型本身,也不是构造函数。
谁调用,this 就指向谁
只要方法是通过点号(.)或方括号([])从某个实例上调用的,无论这个方法定义在实例自身、原型上,还是原型链更上游的位置,this 始终绑定到那个调用它的实例。
- 例如:
obj.say()中的this指向obj,哪怕say是定义在obj.__proto__上的方法 - 再如:
arr.push(1)中的this指向arr,而push实际在Array.prototype上
原型链查找不影响 this 绑定
JavaScript 查找方法时会沿着原型链向上找,但一旦找到并执行,执行时的 this 仍由调用表达式决定,和“在哪找到的”无关。
- 即使
son.walk()的walk方法在Father.prototype上,this仍是son实例 - 如果
son自身也有walk属性(遮蔽了原型上的),this还是指向son—— 绑定逻辑不变
注意常见丢失 this 的情况
原型方法的 this 很容易因“脱离调用上下文”而意外改变:
-
const fn = obj.method;→fn()是独立调用,this变成全局或undefined - 传给回调(如
setTimeout(obj.method, 100)或事件监听器)也会丢失绑定 - 解决方式:用
obj.method.bind(obj)、function() { obj.method() }、箭头函数(若在对象方法内定义)、或类中使用公共字段语法method = () => {...}
对比构造函数中的 this
构造函数内部的 this 指向新创建的实例,而原型方法中的 this 也指向该实例——二者最终指向一致,只是作用阶段不同:前者用于初始化属性,后者用于复用行为。
- 所以
new Person().getName()中,构造函数里的this和getName里的this都是同一个实例 - 这也正是原型继承能正常工作的基础:子实例调用父原型方法时,
this仍是子实例,因此可以访问子实例自身的属性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











