隐式绑定由调用形式决定:obj.method()中this始终指向obj,与方法定义位置无关;脱离该形式则退为默认绑定;修复需显式绑定或箭头函数;继承中this仍指向子类实例。

隐式绑定在原型链方法调用中,表现得非常一致且可预测:只要写法是 obj.method(),无论 method 是定义在实例自身、原型对象,还是更上层的 Object.prototype 上,this 都指向 obj。关键不在方法“在哪定义”,而在“怎么调用”。
调用形式决定 this,和原型位置无关
JavaScript 查找方法时会沿 __proto__ 向上遍历,但 this 的绑定发生在调用那一刻,不是查找那一刻。引擎只看调用语法:
-
person.getName()→ this 是person,哪怕getName在Person.prototype上 -
arr.join()→ this 是arr,哪怕join定义在Array.prototype -
obj.toString()→ this 是obj,哪怕toString来自Object.prototype
常见丢失 this 的场景
一旦脱离“对象.方法”的调用形式,隐式绑定就失效,退回到默认绑定:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 赋值后调用:
const fn = obj.method; fn();→ this 不再是 obj - 作为回调传入:
btn.addEventListener('click', obj.handleClick)→ 点击时 this 指向 btn(DOM 元素),不是 obj - 数组方法中直接使用:
[1,2].map(obj.method)→ map 内部调用时无上下文,this 丢失
修复方式:显式绑定或箭头函数
需要保留原对象上下文时,有几种可靠做法:
立即学习“Java免费学习笔记(深入)”;
- 调用时用
call/apply:obj.method.call(otherObj, arg1, arg2) - 提前绑定:
const bound = obj.method.bind(obj); bound(); - 事件监听中常用:
btn.addEventListener('click', () => obj.handleClick())(用箭头函数保持词法 this) - 注意:原型上定义的箭头函数不参与隐式绑定,它的 this 是定义时外层作用域的值,不是调用时的对象
继承场景下的 this 指向
子类实例调用继承来的方法,this 仍是子类实例本身:
class Parent { log() { console.log(this.constructor.name); } }class Child extends Parent {}-
new Child().log()→ 输出 "Child",不是 "Parent"

















