原型链中原型继承为什么会出现这不同的结果?

目的:

让A继承自B,B继承自C,但是前后两种写法换了位置,为什么第一种写法B的原型指向的是Object而不是C,第二种写法却是正确的?

我的理解:

我的理解是prototype指向一个对象,表示为原型对象,那么在第一种写法里面,我将new B(),赋值为A的原型属性,那么new B()这个对象的__proto__指向其构造函数B的原型对象,然后我将构造函数B的原型指向new C()对象。 但是为什么结果却和预想的不一样呢?

第一种写法:

https://img4.mukewang.com/5ca439240001baac05670409.jpg

https://img1.mukewang.com/5ca439240001e00603140086.jpg

第二种写法:

https://img2.mukewang.com/5ca4392700018e7904800429.jpg

https://img2.mukewang.com/5ca4392800016b8502610075.jpg


qq_花开花谢_0
浏览 388回答 1
1回答

千万里不及你

js有变量提升,所以第一段相当于function A () {  }function B () {}function C () {  }var aObj;A.prototype = new B(); // 在设置A的原型对象的时候B的原型对象还是普通的objectA.prototype.constructor = A;B.prototype = new C();B.prototype.constructor = B; // 此时B的原型对象才设置成功// A.prototype = new B(); // 这个时候new的B的原型才是C.prototypeaObj = new A();console.log(aObj);Update:你的疑惑点可能是如果我改变了一个方法的prototype属性,那么原先new的对象会不会自动更新原型对象?function B () {}let b = new B()console.log(b.__proto__ === B.prototype) // trueB.prototype = {} // 改变B的原型console.log(b.__proto__ === B.prototype) // false,说明原先new的对象不会自动更新原型对象抽象一下上面的过程,变成以下:console.log(b.__proto__ === B.prototype) // trueB.prototype = {} // 改变B的原型console.log(b.__proto__ === B.prototype) // false简化一下,用c代替b.__proto__,d代替B.prototype:console.log(c === d) // trued = {}console.log(c === d) // false也就是一开始c和d指向同一个对象,然后使d指向另外一个对象,那么请问此时c是否会自动更新,指向新的对象?答:为什么会自动更新。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript