关于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:定义构造函数
Rabbit并将其prototype指向包含eats: true的对象,用new创建rabbit实例后,把Rabbit.prototype改为空对象。访问rabbit.eats时,JS先在rabbit自身查找,找不到就沿原型链找到旧原型对象的eats属性,因此输出true。 - 案例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
相关产品推荐
相关产品推荐

