JS繼承之組合繼承
阿新 • • 發佈:2018-11-08
前面介紹了原型鏈繼承以及建構函式繼承,它們都有各自的優缺點
特點 | 優點 | 缺點 | |
---|---|---|---|
原型鏈繼承 | 子類原型prototype對父類例項化來實現 | 子類不僅僅可以訪問父類原型上的屬性和方法,同樣也可以訪問從父類建構函式中複製的屬性和方法 | 1.一個子類原型更改子類原型從父類繼承來的引用型別屬性就會直接影響其他子類; 2.由於子類實現的繼承是靠其原型對父類的例項化實現的,因此在建立父類的時候,是無法向父類傳遞引數的,因而在例項化父類時也無法對父類建構函式的屬性進行初始化。 |
建構函式繼承 | 在子類建構函式作用環境執行一次父類的建構函式實現 | 避免了引用型別的屬性被所有例項共享,而且可以在子類中向父類傳參 | 這種型別的繼承沒有涉及原型prototype,所以父類的原型方法自然不會被子類繼承,而要想被子類繼承就必須把放在建構函式裡,這樣創建出來的每個例項都會單獨擁有一份而不能共用,這樣就違背了程式碼複用的原則 |
基於此,為了綜合這兩種模式的優點,就有了組合繼承。
function Parent (name) {
this.name = name;
this.colors = ['red' , 'blue', 'green'];
}
Parent.prototype.getName = function () { return this.name; }
function Child (name, age) {
Parent.call(this, name);
this.age = age;
}
Child.prototype = new Parent();
首先,在子類建構函式執行了父類建構函式,然後子類原型上例項化父類就是組合模式。如此,組合式繼承就融合了原型鏈繼承和建構函式繼承的優點,並且過濾了其缺點。