JS面向對象之拷貝繼承

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方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章