JS中的繼承和我們現實當中的繼承類似,就是子類(繼承者)擁有父類(被繼承者)的所有特性(屬性與方法),同時子類又可以擁有自己特定的屬性或方法(基因突變),而且子類的改變不會影響到父類。我們爲什麼要繼承呢?其實主要是爲了代碼複用。
繼承分兩個部分,第一是屬性的繼承,第二是方法的繼承。
我們先創造一個簡單的父類:
function CreatePerson(name,sex){ //父類
this.name = name;
this.sex = sex;
}
這個父類有兩個屬性name和sex。
我們再往這個父類身上添加一些功能(方法):
CreatePerson.prototype.showName = function(){
alert( this.name );
};
這個父類就有了showName這個方法,然後我們就去實例化它:
var p1 = new CreatePerson('小明','男');
我們可以在Chrome的控制檯那裏打印一下p1這個對象,看看它有什麼:
接下來,我們定義一個子類,這個子類繼承CreatePerson。
function CreateStar(name,sex,job){ //子類
CreatePerson.call(this,name,sex);
this.job = job;
}
我們通過在子類內部調用父類CreatePerson的構造函數,利用call改變this指向,使子類擁有了父類的所有屬性(屬性繼承)。這個子類也有自己獨特的屬性job(基因突變)。
這個子類CreateStar繼承了父類CreatePerson的屬性後就要繼承父類的方法了,這裏我們用拷貝繼承的編程技術,因爲直接把父類的原型對象賦給子類的原型對象(CreateStar.prototype = CreatePerson.prototype)會造成對象間的引用,這不符合繼承的定義,因爲對象間的引用會使得子類的改變影響到父類,就是父類會隨着子類的改變而改變,這就麻煩了。
定義一個繼承的方法:
/**
1. 子類繼承父類函數的方法
2. @param obj1 子類
3. @param obj2 父類
*/
function extend(obj1,obj2){
for(var attr in obj2){
obj1[attr] = obj2[attr];
}
}
子類CreateStar要繼承父類CreatePerson的方法,只要直接調用extend這個方法就可以了。
extend( CreateStar.prototype , CreatePerson.prototype );
我們再定義子類CreateStar特有的方法:
CreateStar.prototype.showJob = function(){
};
這樣,子類擁有了showJob方法後就不會因爲對象間的引用的原因,使得父類也有showJob方法了。
我們實例化一下這個子類:
var p2 = new CreateStar('劉德華','男','演員');
此時,我們可以在Chrome的控制檯那裏打印一下p1和p2這個兩個對象,看看它們的區別:
總結:
1. 繼承的定義
2. 屬性繼承與方法繼承
3. 拷貝繼承extend方法