Javascript 原型链将如何断裂?

Javascript 原型链将如何断裂?,javascript,ecmascript-6,Javascript,Ecmascript 6,我正在尝试学习JavaScript中的继承。这篇关于的文章解释了原型链是如何工作的 let f = function () { this.a = 1; this.b = 2; } let o = new f(); // {a: 1, b: 2} f.prototype.b = 3; f.prototype.c = 4; 有评论说 // do not set the prototype f.prototype = {b:3,c:4}; this will break the

我正在尝试学习JavaScript中的继承。这篇关于的文章解释了原型链是如何工作的


let f = function () {
   this.a = 1;
   this.b = 2;
}
let o = new f(); // {a: 1, b: 2}


f.prototype.b = 3;
f.prototype.c = 4; 

有评论说

// do not set the prototype f.prototype = {b:3,c:4}; this will break the prototype chain
这条链子怎么断。我的猜测是,因为我们正在覆盖构造函数的prototype对象,所以向上链的所有其他引用都将丢失。但是我们可以使用object.create(someobject)将object设置为f.prototype,这不会断开链

f.prototype = Object.create(someobject);

someobject的属性和方法将在f.Prototype对象中可用。因此,f的所有实例都将具有这些方法和属性

为什么它不会断链?

Object.create()直接基于提供的(prototype)参数构造对象。参数本身(可能)通过其[[prototype]]属性具有所有可用的引用

我的猜测是,因为我们正在覆盖构造函数的prototype对象,所以上链的所有其他引用都将丢失。不完全是。这并不是说上行链参考丢失了。这是因为您替换了当前的原型,所以原型上已经存在的任何其他内容现在都将丢失。这与执行
让x={a:1}
然后执行
x={b:2}
是一样的。您将分配给
x
的整个对象替换为另一个对象,因此当您执行
console.log(x)
操作时,该对象上不会有
属性。