原型鏈?zhǔn)侨绾涡纬傻模?/h2>
每個(gè)子類的實(shí)例對(duì)象都包含一個(gè)內(nèi)部屬性 _proto_ 屬性,該屬性包含一個(gè)指針摧冀,指向父類的prototype倍踪,即原型對(duì)象。若父類的原型對(duì)象的 _proto_ 屬性再指向上層函數(shù)索昂,即爺爺類的prototype建车,層層往上,就成了原型鏈椒惨。
JS 中每一個(gè)函數(shù)都存在原型對(duì)象屬性 prototype,并且只有函數(shù)才有原型對(duì)象 prototype 屬性
所有函數(shù)的默認(rèn)原型都是Object 的實(shí)例
實(shí)現(xiàn)繼承的幾種方法缤至,優(yōu)缺點(diǎn)?
一康谆、原型鏈繼承法
子類的 prototype 屬性指向父類實(shí)例
代碼示例
function Parent(){
this.name = ['小黑','小白'];
}
Parent.prototype.getName = function(){
console.log(this.name);
}
function Child(){
}
Child.prototype = new Parent(); //關(guān)鍵代碼
缺點(diǎn)
- 父類引用類型的屬性领斥,會(huì)被所有實(shí)例共享,例如:
var myChild = new Child();
var herChild = new Child();
myChild.name.push('小黃');
console.log(myChild.name); // ['小黑','小白','小黃'];
console.log(herChild.name); // ['小黑','小白','小黃'];
- 創(chuàng)建子類實(shí)例時(shí)沃暗,不能像父類傳參
二月洛、借用構(gòu)造函數(shù)繼承法(經(jīng)典繼承)
在子類構(gòu)造函數(shù)內(nèi)通過(guò)call、apply,執(zhí)行父類構(gòu)造函數(shù)
代碼示例
function Parent(){
this.name = ["小黑","小白"];
}
function Child(){
Parent.call(this);
}
var myChild = new Child();
var herChild - new Child();
myChild.name.push("小黃");
console.log(myChild.name); // ["小黑","小白","小黃"]
console.log(myChild.name); // ["小黑","小白"]
優(yōu)點(diǎn)
- 避免引用類型的屬性被所有實(shí)例共享
- 可以在子類實(shí)例化的時(shí)候孽锥,向父類傳遞參數(shù)嚼黔,例如:
function Parent(name){
this.name =name;
}
function Child(name){
Parent.call(this,name);
}
var myChild = new Child('小黑');
var herChild = new Child('小白');
console.log(myChild.name); // 小黑
console.log(herChild.name); //小白
三、組合繼承法
運(yùn)用原型鏈繼承和經(jīng)典繼承(借用構(gòu)造函數(shù)繼承法)
優(yōu)點(diǎn):融合原型鏈繼承和借用構(gòu)造函數(shù)繼承的優(yōu)點(diǎn)惜辑,是javascript中最常用的繼承方式
代碼示例
function Parent (name){
this.name = name;
}
Parent.prototype.getName = function(){
console.log(name)
}
function Child(){
Parent.call(this,name);
this.age = 20;
}
Child.prototype = new Parent();
Child.prototype.constructor = Child;//構(gòu)造函數(shù)指向自身