javascript中this绑定与原型链密切相关:原型链决定方法调用主体,从而影响this指向;原型本身不改变this,但方法通过实例调用时this始终指向该实例,而非原型对象。

JavaScript 中的 this 绑定和原型链看似独立,实则密切相关——this 的值在函数调用时确定,而原型链影响的是“谁调用了函数”,进而决定 this 指向谁。理解这一点,关键不是把原型链当成 this 的来源,而是看清“方法调用路径”如何通过原型链触发绑定逻辑。
原型链本身不改变 this,但影响调用主体
当一个对象没有某个方法,却能调用它(比如 obj.sayName()),是因为引擎沿着 __proto__ 向上查找,在原型上找到了该方法。此时真正执行的是 obj.prototypeMethod() 形式,即“方法由 obj 调用”。所以 this 仍指向 obj,而不是原型对象本身。
- 即使方法定义在
Object.prototype上(如自定义的toString),只要调用形式是myObj.toString(),this就是myObj - 如果手动用
call/apply在原型方法上调用,this才会变成你传入的对象,与原型链无关 - 箭头函数没有自己的
this,它继承外层函数作用域的this,完全绕过原型调用带来的绑定效果
构造函数 + 原型 + this 的典型协作模式
这是最易混淆也最体现二者关系的场景:构造函数初始化实例属性,原型提供共享方法,而这些方法中的 this 自动指向新创建的实例。
- 构造函数内部的
this指向新实例(由new绑定) - 写在
Constructor.prototype上的方法,被实例继承后调用时,this仍是该实例——因为调用者是实例,不是原型 - 错误写法:
Person.prototype.getName = () => { return this.name; },箭头函数捕获的是定义时的this(通常是全局或 undefined),不是调用者
显式绑定(call/apply/bind)会覆盖原型调用的默认 this
原型链只是让方法“可被找到”,但不干预绑定规则。一旦使用 call、apply 或 bind,this 就按显式规则确定,原型信息被忽略。
-
obj.method.call(otherObj):无论method在obj自身还是其原型上,this都是otherObj -
const bound = obj.method.bind(otherObj); bound():同上,绑定优先级高于调用位置 - 注意:
bind返回的新函数,其this已固化,后续再用call也无法覆盖(除非是new调用)
ES6 class 语法糖背后的原型链与 this
class 并未改变底层机制,只是让原型继承更清晰。类方法自动添加到 ClassName.prototype,调用时 this 依然由调用者决定。
-
class A { method() { console.log(this); } }等价于在A.prototype上定义method - 若把类方法赋值给变量后单独调用:
const fn = a.method; fn();,this丢失(严格模式下为undefined),因为调用者不再是a - 解决方式:用
bind、箭头函数属性(method = () => {})、或调用时用a.method.bind(a)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











