原型方法调用时this遵循隐式绑定规则,即obj.method()中this始终指向obj,无论method定义在实例或原型上;赋值后调用会丢失绑定,需用call/apply/bind修复;箭头函数不参与隐式绑定,其this由定义时词法作用域决定。

对象原型方法调用时,this 的绑定触发的是隐式绑定规则——只要方法是通过“对象.方法”这种形式调用的,无论该方法定义在实例自身还是原型上,this 都指向调用它的那个对象实例。
原型链上的方法调用仍属隐式绑定
JavaScript 查找方法时会沿原型链向上搜索,但绑定 this 发生在**调用时刻**,而不是定义或查找时刻。只要调用写法是 obj.method(),引擎就按隐式绑定规则,把 this 设为 obj。
- 即使
method在Object.prototype上(比如自定义的toString),obj.method()中的 this 仍是obj - 如果子类继承父类方法(如通过
class Child extends Parent),childInstance.method()中的 this 指向childInstance,不是父类构造函数或原型对象
常见陷阱:赋值后调用导致隐式绑定丢失
把原型方法赋值给变量再调用,就不再是“对象.方法”形式,退回到默认绑定:
-
const fn = obj.method; fn();→ this 不再是obj,而是全局对象(非严格)或undefined(严格) -
array.forEach(obj.method)同理:回调中 this 丢失,因为forEach内部是独立调用obj.method
显式绑定可修复原型方法的 this
当需要脱离对象上下文复用原型方法时,可用 call/apply/bind 强制指定 this:
-
obj.method.call(otherObj, ...args)—— 立即执行,this 指向otherObj -
const bound = obj.method.bind(someObj); bound();—— 创建永久绑定新函数 - 数组方法中常用:
[1,2,3].map(Array.prototype.join.bind(null, '-'))
箭头函数不参与原型 this 绑定
原型上定义的箭头函数没有自己的 this,它直接继承定义时外层作用域的 this(通常是构造函数或模块顶层),不会随调用对象变化:
-
class C { m = () => console.log(this); }→new C().m()中的 this 是实例,但这是词法继承,不是隐式绑定生效 - 普通函数写法
m() { console.log(this); }才真正响应原型调用的隐式绑定











