原型方法中的 this 指向调用该方法的那个实例对象,而非原型对象本身;即使方法定义在原型上、通过继承调用,this 仍绑定到调用者实例,与定义位置无关。

原型方法中的 this 指向**调用该方法的那个实例对象**,而不是原型对象本身。
调用者决定 this,不是定义位置
JavaScript 不关心方法写在哪儿——哪怕它定义在原型上,只要你是用 obj.method() 这种方式调用的,this 就绑定到 obj 这个实例上。
- 即使
obj自身没有该方法,只是通过原型链继承来的,this仍是obj - 原型对象本身不会成为
this,它只负责提供可共享的方法 - 查找过程(沿
__proto__向上)和绑定过程(this确定)是两件事:查得到方法 ≠ this 指向原型
常见例子说明
比如:
const proto = { say() { console.log(this.name); } };
const obj = { name: 'Tom' };
Object.setPrototypeOf(obj, proto);
obj.say(); // 输出 'Tom' —— this 是 obj,不是 proto
这里 say 在 proto 上,但调用的是 obj.say(),所以 this 是 obj。方法内部访问的 this.name,实际读的是 obj.name。
立即学习“Java免费学习笔记(深入)”;
容易出错的情况:隐式丢失
一旦脱离“点调用”形式,this 就会变:
-
const fn = obj.say; fn();→this是undefined(严格模式)或全局对象 -
setTimeout(obj.say, 100);→ 同样丢失绑定,this不再是obj - 修复方式:用
bind、箭头函数包裹、或改成setTimeout(() => obj.say(), 100)
构造函数与原型中 this 的一致性
无论是构造函数里直接挂到 this 上的方法,还是挂到 prototype 上的方法,只要被实例以点语法调用,this 都指向该实例:
-
new Person().getName()中,getName在原型上,this仍是新实例 - 构造函数内部的
this.xxx = ...和原型方法里的this.xxx访问的是同一份实例属性


















