对象方法中的 this 指向调用者对象,与方法定义位置无关;prototype 是共享方法的公共仓库,不参与 this 绑定,仅提供继承能力;new 调用才建立 this 与 prototype 的关联。

对象方法里的 this 指向调用它的那个对象,而 prototype 是共享属性和方法的“公共仓库”——两者看似独立,实则通过函数调用方式与实例化过程紧密咬合。
对象方法调用时,this 指向明确且直接
当一个函数作为对象的属性被调用(如 obj.method()),函数内部的 this 就指向 obj。这个绑定发生在调用那一刻,和函数定义在哪、写在哪儿完全无关。
- 哪怕方法是从原型上继承来的,只要它是以
obj.method()形式调用,this仍是obj - 如果把该方法单独提取出来再调用(如
const fn = obj.method; fn();),this就会丢失,退回到默认绑定(非严格模式下是window) - 箭头函数不绑定
this,它沿用外层普通函数的this值,所以不适合用作需要动态this的对象方法
prototype 提供方法,但不改变 this 的绑定逻辑
prototype 是构造函数的属性,指向一个对象;所有由该构造函数创建的实例,其内部 __proto__ 都指向这个 prototype。方法放在这里,是为了复用,不是为了干预 this。
- 实例调用方法时,先查自身属性;没找到,就顺着
__proto__去prototype上找——但整个查找过程不影响this的值,this仍由“谁在调用”决定 - 例如:
function Person(name) { this.name = name; } Person.prototype.sayHi = function() { console.log('Hi, I am ' + this.name); }; const p = new Person('Alice'); p.sayHi();—— 这里this是p,不是Person.prototype - 即使你修改
Person.prototype.sayHi,也不会改变已存在实例的this行为,只会影响后续调用时执行的内容
new 调用是关键桥梁:连接 this 与 prototype
使用 new 调用构造函数时,JavaScript 引擎会做四件事:创建空对象 → 把该对象的 __proto__ 指向构造函数的 prototype → 将 this 绑定到该新对象 → 执行函数体。
- 这一步让
this和prototype发生实质性关联:this成为实例本身,而它的原型链起点正是Constructor.prototype - 所以,
prototype不是给this“赋值”的地方,而是为this提供可继承能力的基础设施 - 没有
new,普通函数调用中的this就不会指向新对象,也就谈不上和prototype的继承关系
常见误区:别混淆 this 的来源和方法的存放地
有人误以为“方法在 prototype 上,所以 this 应该指向 prototype”,这是错的。prototype 只是存储位置,this 的值永远取决于调用时的上下文主体。
-
obj.method()中的this是obj,哪怕method在obj.__proto__上 -
func.call(obj)或func.bind(obj)显式指定this,此时func是否在 prototype 上毫无影响 - 给
prototype添加方法,只是让多个实例能共用同一份代码,并不赋予它们新的this绑定规则











