創(chuàng)建父類
function Animal(name){
this.name = name
this.sleep = function(){
console.log(this.name + '正在睡覺(jué)餐抢!');
}
}
Animal.prototype.eat = function(food){
console.log(this.name + '繼承吃' + food + '的方法!');
}
// 創(chuàng)建實(shí)例
var animal = new Animal("旺財(cái)");
console.log(animal.name); // 旺財(cái)
animal.eat('骨頭'); // 旺財(cái)繼承吃骨頭的方法!
animal.sleep(); // 旺財(cái)正在睡覺(jué)!
原型鏈繼承:將父類的實(shí)例作為子類的原型
function Cat(){}
Cat.prototype = new Animal();
Cat.prototype.name = "喵喵";
var cat = new Cat();
console.log(cat.name) // 喵喵
cat.eat("鯽魚(yú)"); // 喵喵繼承吃鯽魚(yú)的方法!
cat.sleep(); // 喵喵正在睡覺(jué)芯砸!
console.log(cat instanceof Animal) // true
console.log(cat instanceof Cat); // true
優(yōu)點(diǎn):
1硼端、非常純粹的繼承關(guān)系并淋,實(shí)例是子類的實(shí)例,也是父類的實(shí)例
2珍昨、父類新原型方法和屬性县耽,子類都能訪問(wèn)到
缺點(diǎn):
1、想為子類增加屬性和方法镣典,必須先實(shí)例化父類 new Animal()
2兔毙、無(wú)法實(shí)現(xiàn)多繼承
3、來(lái)自原型對(duì)象的引用屬性被所有實(shí)例共享
4兄春、創(chuàng)建子類實(shí)例時(shí)澎剥,無(wú)法向父類構(gòu)造函數(shù)傳參
借用構(gòu)造函數(shù)繼承:在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用父類的構(gòu)造函數(shù)
function Cat(name){
Animal.call(this);
this.name = name || "Tom";
}
Cat.prototype.eat = function(food){
console.log(this.name + "自帶吃" + food + "的方法!")
}
var cat = new Cat("喵喵");
console.log(cat.name) // 喵喵
cat.eat("鯽魚(yú)"); // 喵喵自帶吃鯽魚(yú)的方法赶舆!
cat.sleep(); // 喵喵正在睡覺(jué)哑姚!
console.log(cat instanceof Animal) // false
console.log(cat instanceof Cat); // true
優(yōu)點(diǎn):
1、子類和父類屬性不共享
2芜茵、創(chuàng)建子類實(shí)例時(shí)可以向父類傳遞參數(shù)
3叙量、可以實(shí)現(xiàn)多繼承(通過(guò)call調(diào)用多個(gè)父類對(duì)象)
缺點(diǎn):
1、實(shí)例并不是父類的實(shí)例九串,只是子類的實(shí)例(不在一個(gè)原型鏈上)
2绞佩、只能繼承父類的實(shí)例屬性和方法,不能繼承父類原型屬性和方法
3猪钮、無(wú)法實(shí)現(xiàn)函數(shù)復(fù)用品山,每個(gè)子類都有父類實(shí)例函數(shù)的副本,影響性能
組合繼承:借用父類構(gòu)造函數(shù)和實(shí)例進(jìn)行組合繼承
function Cat(name) {
Animal.call(this);
this.name = name
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
var cat = new Cat("喵喵");
console.log(cat.name); // 喵喵
cat.eat("鯽魚(yú)"); // 喵喵繼承吃鯽魚(yú)的方法!
cat.sleep(); // 喵喵正在睡覺(jué)烤低!
console.log(cat instanceof Animal) // true
console.log(cat instanceof Cat); // true
優(yōu)點(diǎn):
1肘交、彌補(bǔ)了借用構(gòu)造函數(shù)繼承方式的缺陷, 可以繼承實(shí)例屬性和方法,也可以繼承原型屬性和方法
2拂玻、即使子類的實(shí)例酸些,也是父類的實(shí)例
3宰译、不存在引用屬性共享的問(wèn)題
4、函數(shù)可以傳參也可復(fù)用
缺點(diǎn):
1魄懂、調(diào)用了兩次父類構(gòu)造函數(shù)沿侈,生成了兩份實(shí)例
寄生繼承:
function Cat(name){
Animal.call(this);
this.name = name;
}
function F(){}
F.prototype = Animal.prototype;
Cat.prototype= new F();
Cat.prototype.costructor = Cat;
var cat = new Cat("喵喵");
console.log(cat.name); // 喵喵
cat.eat("鯽魚(yú)"); // 喵喵繼承吃鯽魚(yú)的方法!
cat.sleep(); // Uncaught TypeError: cat.sleep is not a function-報(bào)錯(cuò),只繼承了父類Animal上構(gòu)造函數(shù)的屬性及方法
有點(diǎn)