原型方法中this指向调用它的实例对象,实现动态访问实例属性;通过obj.method()调用时自动绑定,支持读写、判断及链式调用;陷阱在于调用方式改变导致this丢失,可用箭头函数或bind修复。

原型方法里的 this 指向调用它的那个实例对象,这是实现动态访问实例数据的核心前提。只要方法定义在原型上,调用时自动绑定当前实例,无需手动传参或闭包保存上下文。
原型方法中 this 的本质行为
无论方法写在构造函数内部还是 prototype 上,只要通过 obj.method() 形式调用,this 就指向 obj。原型方法也不例外:
- 构造函数中
this.name = 'Alice',给实例挂属性 - 原型上
Person.prototype.getName = function() { return this.name },其中this就是调用它的那个实例 - 执行
const p = new Person(); p.getName()→this就是p,自然读到p.name
利用 this 动态读写实例属性的典型写法
所有操作都基于“调用者即 this”这一规则,无需额外处理:
-
读取:直接用
this.xxx访问当前实例的自有属性(如this.id、this.items) -
修改:赋值语句如
this.count++或this.status = 'done'会更新该实例自身 -
判断:配合逻辑使用,例如
if (this.isActive) { ... } -
链式调用支持:方法末尾返回
this,就能连续调用多个原型方法
常见陷阱与规避方式
真正出问题的地方,往往不是原型本身,而是调用方式被破坏:
- 把方法单独提取后调用:
const fn = obj.doSomething; fn()→this丢失(指向全局或undefined) - 定时器/事件回调中直接使用普通函数:
setTimeout(obj.method, 100)→this不再是obj - 解决办法很直接:用箭头函数包裹、用
.bind(obj)、或改用setTimeout(() => obj.method(), 100)
扩展内置对象时的 this 应用
给数组加求和方法是个经典例子,this 自动指向调用它的那个数组实例:
Array.prototype.sum = function() {
let total = 0;
for (let i = 0; i < this.length; i++) {
total += this[i];
}
return total;
};
[1, 2, 3].sum(); // 6 → this 就是 [1,2,3]
这里 this.length 和 this[i] 都依赖 this 正确指向当前数组,不需要传入任何参数,也不关心数组怎么创建的。

















