为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

qq_花开花谢_0 2019-03-22 12:15:41
目的:让A继承自B,B继承自C,但是前后两种写法换了位置,为什么第一种写法B的原型指向的是Object而不是C,第二种写法却是正确的?我的理解:我的理解是prototype指向一个对象,表示为原型对象,那么在第一种写法里面,我将new B(),赋值为A的原型属性,那么new B()这个对象的__proto__指向其构造函数B的原型对象,然后我将构造函数B的原型指向new C()对象。 但是为什么结果却和预想的不一样呢?第一种写法:第二种写法:
查看完整描述

1 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

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

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

答:为什么会自动更新。


查看完整回答
反对 回复 2019-04-03
  • 1 回答
  • 0 关注
  • 387 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号