JavaScript中this指向取决于调用时的上下文而非定义位置:obj.method()中this始终为obj,即使method来自原型;赋值后单独调用则丢失绑定;原型链查找不影响this,它永远是初始调用者。

在JavaScript中,原型链上的方法内部使用this时,它的指向**完全取决于该方法被谁调用(即调用时的上下文)**,而不是定义在哪个对象或原型上。换句话说,this的绑定发生在**运行时调用那一刻**,和“写在哪”无关。
调用方式决定this指向
只要方法是作为对象的属性被“点调用”,this就自动绑定为该对象(即调用者)。即使这个方法来自原型链,也一样:
- ✅ 正常点调用:
obj.method()→this指向obj - ✅ 原型上的方法:
obj自身没有method,但obj.__proto__有 → 调用仍是obj.method(),this仍指向obj - ❌ 赋值后单独调用:
const fn = obj.method; fn();→this指向undefined(严格模式)或全局对象(非严格)
原型链查找不影响this绑定
JS引擎查找方法时会沿原型链向上找,但一旦找到并执行,this始终是**最初发起调用的那个对象**,不是原型对象本身。例如:
const proto = { say() { console.log(this.name); } };
const obj = { name: 'Alice' };
Object.setPrototypeOf(obj, proto);
obj.say(); // 输出 'Alice' —— this 是 obj,不是 proto
这里 say 在 proto 上,但 this 是 obj,因为调用语法是 obj.say()。
立即学习“Java免费学习笔记(深入)”;
常见陷阱与应对
容易出错的情况通常是把方法提取出来再调用,导致丢失原始上下文:
- 事件监听器:
button.addEventListener('click', obj.handleClick)→this不再是obj - 数组遍历:
arr.forEach(obj.method)→this是undefined - 解决办法:用箭头函数包裹、
.bind(obj)、或改写为arr.forEach(item => obj.method(item))
构造函数和class中的情况
用 class 或构造函数创建实例时,方法通常定义在原型上(如 class A { foo() {} } 中的 foo 在 A.prototype),但只要通过实例调用(new A().foo()),this 就是该实例。这是JS默认行为,无需额外绑定。


















