为何实例化对象在构造函数原型重设为空后仍保留原型属性?
为什么重设构造函数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
相关产品推荐
相关产品推荐

