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

新手上路,请多包涵

目的:

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

我的理解:

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

第一种写法:

第一种写法
第一种写法的结果

第二种写法:

第二种写法
第二种写法的结果

阅读 1.5k
1 个回答

js有变量提升,所以第一段相当于

function A () {
  
}
function B () {

}
function C () {
  
}
var aObj;
A.prototype = new B(); // 在设置A的原型对象的时候B的原型对象还是普通的object
A.prototype.constructor = A;

B.prototype = new C();
B.prototype.constructor = B; // 此时B的原型对象才设置成功

// A.prototype = new B(); // 这个时候new的B的原型才是C.prototype

aObj = new A();
console.log(aObj);

Update:
你的疑惑点可能是如果我改变了一个方法的prototype属性,那么原先new的对象会不会自动更新原型对象?

function B () {}
let b = new B()
console.log(b.__proto__ === B.prototype) // true
B.prototype = {} // 改变B的原型
console.log(b.__proto__ === B.prototype) // false,说明原先new的对象不会自动更新原型对象

抽象一下上面的过程,变成以下:

console.log(b.__proto__ === B.prototype) // true
B.prototype = {} // 改变B的原型
console.log(b.__proto__ === B.prototype) // false

简化一下,用c代替b.__proto__d代替B.prototype:

console.log(c === d) // true
d = {}
console.log(c === d) // false

也就是一开始cd指向同一个对象,然后使d指向另外一个对象,那么请问此时c是否会自动更新,指向新的对象?
答:为什么会自动更新。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题