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
相关产品推荐
相关产品推荐

