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

关于JavaScript构造函数Prototype修改机制的结论验证请求

原型链机制验证分析

代码案例

// 案例1
function Rabbit() {}
Rabbit.prototype = {
  eats: true
};

let rabbit = new Rabbit();

Rabbit.prototype = {};

alert( rabbit.eats ); // 输出 true

// 案例2
function Rabbit() {}
Rabbit.prototype = {
  eats: true
};

let rabbit = new Rabbit();

Rabbit.prototype.eats = false;

alert( rabbit.eats ); // 输出 false

用户的场景分析与结论

场景分析

  1. 案例1:定义构造函数Rabbit并将其prototype指向包含eats: true的对象,用new创建rabbit实例后,把Rabbit.prototype改为空对象。访问rabbit.eats时,JS先在rabbit自身查找,找不到就沿原型链找到旧原型对象的eats属性,因此输出true。
  2. 案例2:直接修改Rabbit.prototype的eats属性为false,由于rabbit的[[Prototype]]指向该对象,访问rabbit.eats输出false。

用户结论

创建Rabbit函数时,Rabbit.prototype指向某一内存地址;案例2中Rabbit.prototype与rabbit的原型指向同一内存地址;案例1中重新赋值{}给Rabbit.prototype时,它指向新内存地址,与rabbit原型的旧地址不同,因此rabbit仍能访问旧原型的属性。


结论验证

你的结论完全正确。核心逻辑如下:

  • 用new创建实例时,会把实例内部的[[Prototype]](即__proto__)指向构造函数当前的prototype对象,这个指向关系在实例创建完成后就固定了,不会随构造函数prototype的后续重新赋值改变。
  • 案例1中,Rabbit.prototype = {}是给构造函数的prototype属性重新赋值了全新对象,但rabbit实例的[[Prototype]]依然指向之前包含eats: true的旧对象,所以访问rabbit.eats会读取旧原型的属性。
  • 案例2中,Rabbit.prototype.eats = false是直接修改了Rabbit.prototype指向的原有对象的属性,而rabbit的[[Prototype]]始终指向这个对象,因此实例能读取到修改后的属性值。

内容的提问来源于stack exchange,提问作者LICON99

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:43:13