在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Python  HTML/ 原型鏈中原型繼承為什么會(huì)出現(xiàn)這不同的結(jié)果?

原型鏈中原型繼承為什么會(huì)出現(xiàn)這不同的結(jié)果?

目的:

讓A繼承自B,B繼承自C,但是前后兩種寫(xiě)法換了位置,為什么第一種寫(xiě)法B的原型指向的是Object而不是C,第二種寫(xiě)法卻是正確的?

我的理解:

我的理解是prototype指向一個(gè)對(duì)象,表示為原型對(duì)象,那么在第一種寫(xiě)法里面,我將new B(),賦值為A的原型屬性,那么new B()這個(gè)對(duì)象的__proto__指向其構(gòu)造函數(shù)B的原型對(duì)象,然后我將構(gòu)造函數(shù)B的原型指向new C()對(duì)象。 但是為什么結(jié)果卻和預(yù)想的不一樣呢?

第一種寫(xiě)法:

第一種寫(xiě)法
第一種寫(xiě)法的結(jié)果

第二種寫(xiě)法:

第二種寫(xiě)法
第二種寫(xiě)法的結(jié)果

回答
編輯回答
失心人

js有變量提升,所以第一段相當(dāng)于

function A () {
  
}
function B () {

}
function C () {
  
}
var aObj;
A.prototype = new B(); // 在設(shè)置A的原型對(duì)象的時(shí)候B的原型對(duì)象還是普通的object
A.prototype.constructor = A;

B.prototype = new C();
B.prototype.constructor = B; // 此時(shí)B的原型對(duì)象才設(shè)置成功

// A.prototype = new B(); // 這個(gè)時(shí)候new的B的原型才是C.prototype

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

Update:
你的疑惑點(diǎn)可能是如果我改變了一個(gè)方法的prototype屬性,那么原先new的對(duì)象會(huì)不會(huì)自動(dòng)更新原型對(duì)象?

function B () {}
let b = new B()
console.log(b.__proto__ === B.prototype) // true
B.prototype = {} // 改變B的原型
console.log(b.__proto__ === B.prototype) // false,說(shuō)明原先new的對(duì)象不會(huì)自動(dòng)更新原型對(duì)象

抽象一下上面的過(guò)程,變成以下:

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

簡(jiǎn)化一下,用c代替b.__proto__,d代替B.prototype:

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

也就是一開(kāi)始cd指向同一個(gè)對(duì)象,然后使d指向另外一個(gè)對(duì)象,那么請(qǐng)問(wèn)此時(shí)c是否會(huì)自動(dòng)更新,指向新的對(duì)象?
答:為什么會(huì)自動(dòng)更新。

2018年9月5日 22:19