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

为何实例化对象在构造函数原型重设为空后仍保留原型属性?

为什么重设构造函数prototype后,已有实例仍能访问旧原型的属性?

先看你给出的代码:

function Rabbit() {}
Rabbit.prototype = { eats: true };
let rabbit = new Rabbit();
Rabbit.prototype = {};
alert( rabbit.eats ); // true

这背后的核心逻辑其实很简单:实例的原型指向是在new执行的瞬间就固定死的,后续修改构造函数的prototype属性,不会影响已经创建好的实例。

咱们一步步拆解整个过程:

  • 当执行let rabbit = new Rabbit()时,JS引擎会完成这些操作:
    • 创建一个空对象rabbit
    • 将这个空对象的内部原型(__proto__)绑定到当前的Rabbit.prototype(也就是那个包含eats: true的对象)
    • 执行构造函数Rabbit()(这里构造函数是空的,没有额外逻辑)
    • 返回这个初始化后的rabbit对象
  • 之后你执行Rabbit.prototype = {},只是把构造函数Rabbit的prototype属性指向了一个全新的空对象,但这不会改变已经存在的rabbit实例的__proto__指向——它依然牢牢指着那个旧的、带有eats: true的原型对象。

所以当你读取rabbit.eats时,JS会先检查rabbit自身有没有这个属性(显然没有),然后顺着__proto__找到旧原型里的eats属性,自然就输出true了。

如果这时候你再创建一个新的Rabbit实例,比如let newRabbit = new Rabbit(),那这个新实例的__proto__才会指向那个空的新原型,它就访问不到eats属性了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:56:18