You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中this.function()为何不指向prototype成员的技术咨询

JavaScript中this.function()为何不指向prototype成员的技术咨询

嘿,我来给你拆解这个JavaScript原型链的问题,先看你提供的这段代码,它刚好能帮我们搞懂原型的共享机制:

function Noob(name, game) {
    this.name = name;
    this.game = game;
}

Noob.prototype.jersey = function () {
    console.log(this.game);
};

let p1 = new Noob("adam", "volleyball");
let p2 = new Noob("eve", "cricket");

p1.jersey(); // 输出 volleyball
p2.jersey(); // 输出 cricket

console.log(p1.__proto__ === p2.__proto__); // 输出 true

你提到的“输出true”,正是这段代码的关键:p1和p2这两个实例的原型指向的是同一个Noob.prototype对象,所以它们并不会各自拥有独立的jersey方法——这个方法是挂载在原型上被所有实例共享的,不会为每个实例重新分配内存,这也是原型模式节省内存的核心优势。

可能你之前的疑惑“this.function()为何不指向prototype成员”是个小误解,实际上这种调用方式就是在使用原型上的成员!JavaScript的原型链查找规则是这样的:

  • 当你调用p1.jersey()时,JS会先在p1自身的属性里找jersey方法
  • 找不到的话,就顺着__proto__(也就是Noob.prototype)往上找,最终找到原型上的那个jersey方法
  • 此时方法里的this会自动绑定到调用它的实例(p1或p2),所以能正确输出各自的game属性

如果想验证这个逻辑,咱们可以给其中一个实例加个同名方法试试:

// 给p1单独加一个jersey方法
p1.jersey = function() {
  console.log(`我是${this.name}自己的jersey方法`);
};

p1.jersey(); // 输出 "我是adam自己的jersey方法"
p2.jersey(); // 还是输出 "cricket",因为p2自身没这个方法,继续用原型上的

这样就能看明白:当实例自身没有对应方法时,this.function()的调用会自动落到原型成员上;只有当实例自己定义了同名方法,才会优先用实例自身的——这就是原型链的工作原理。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 13:14:39