四種繼承方式
1. 原型繼承
- 示例:
var Partent=function(){
this.name="partent";
this.hello=function(){
return "Hello World";
}
}
var Child=function(){
}
Child.prototype=new Partent();
Child.prototype.name="child"
console.log(Child.prototype.name); // child
-
優(yōu)點:
從instanceof
關(guān)鍵字來看餐抢,實例既是父類的實例枫绅,又是子類的實例指黎,看起來似乎是最純粹的繼承 -
缺點:
子類區(qū)別于父類的屬性和方法鹊汛,必須在Child.prototype=new Partent()
這樣的語句之后分別執(zhí)行蒲赂,無法被包裝到Child
這個構(gòu)造器里面去
2. 構(gòu)造繼承
- 示例:
var Partent=function(name){
this.name=name;
this.id=id;
this.hello=function(){
return "Hello World";
}
}
var Child=function(name){
//Partent.call(this); apply()和call()的功能一樣
Partent.apply(this,arguments);
this.name=name;
}
var child=new Child("child"); //child
-
優(yōu)點:
可以實現(xiàn)多重繼承,可以把子類特有的屬性設(shè)置放在構(gòu)造器內(nèi)部 -
缺點:
使用instanceof
發(fā)現(xiàn)刁憋,對象不是父類的實例
3. 實例繼承
- 示例:
var Partent=function(){
this.name="partent";
this.hello=function(){
return "Hello World";
}
}
var Child=function(){
var child=new Partent();
child.name="child";
return child;
}
console.log(new Child().name) //child
-
優(yōu)點:
是父類的對象滥嘴,并且使用new構(gòu)造對象和不使用new構(gòu)造對象,都可以獲得相同的效果 -
缺點:
生成的對象實質(zhì)僅僅是父類的實例至耻,并非子類的對象若皱;不支持多繼承
4. 拷貝繼承
- 示例:
var Partent=function(){
this.name="partent";
this.hello=function(){
return "Hello World";
}
}
var Child=function(){
var partent=new Partent();
for(var i in partent){
Child.prototype[i]=partent[i];
}
Child.prototype.name="child";
}
console.log(new Child().name); //child
//console.log(Child().name); 與上句效果相同
-
優(yōu)點:
支持多繼承 -
缺點:
效率較低镊叁;無法獲取父類不可枚舉的方法
確定原型和實例的關(guān)系
可以通過兩種方式來確定原型和實例之間的關(guān)系。操作符instanceof
和isPrototypeof()
方法
-
instanceof
運算符希望左操作數(shù)是一個對象走触,右操作數(shù)標識對象的類晦譬。如果左側(cè)的對象是右側(cè)類的實例,則表達式返回true互广;否則返回false -
isPrototypeof()
檢測一個對象是否是另一個對象的原型(或者處于原型鏈中)
apply()和call()的使用
- 作用:
改變函數(shù)內(nèi)部this的指向敛腌。this
指向未來將要實例化這個函數(shù)的對象 - 示例:
function animal(name,food) {
this.name = name,
this.food = food,
this.say = function() {
console.log(name +" likes " + this.food + '.');
}
}
function rabbit(name,food) {
animal.call(this,name,food);
//animal.apply(this,arguments); 與上句效果相同
}
var Judy = new rabbit('Judy','carrot');
Judy.say();
- 區(qū)別:
apply
方法傳入兩個參數(shù):一個是作為函數(shù)上下文的對象,另外一個是作為函數(shù)參數(shù)所組成的數(shù)組惫皱。
call
方法第一個參數(shù)也是作為函數(shù)上下文的對象迎瞧,但是后面?zhèn)魅氲氖且粋€參數(shù)列表,而不是單個數(shù)組