封裝:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.htmljavascript
繼承:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.htmlhtml
http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.htmljava
原型鏈繼承:函數
優勢:子類不單單能夠訪問父類原型上的屬性和方法,一樣也能夠訪問從父類構造函數中複製的屬性和方法this
缺點:1.一個子類原型更改子類原型從父類繼承來的引用類型屬性就會直接影響其餘子類;
2.因爲子類實現的繼承是靠其原型對父類的實例化實現的,所以在建立父類的時候,是沒法向父類傳遞參數的,於是在實例化父類時也沒法對父類構造函數的屬性進行初始化。prototype
構造繼承:htm
優勢:避免了引用類型的屬性被全部實例共享,並且能夠在子類中向父類傳參blog
缺點:這種類型的繼承沒有涉及原型prototype,因此父類的原型方法天然不會被子類繼承,而要想被子類繼承就必須把放在構造函數裏,這樣建立出來的每一個實例都會單獨擁有一份而不能共用,這樣就違背了代碼複用的原則繼承
基於此,爲了綜合這兩種模式的優勢,就有了組合繼承。ip
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();
首先,在子類構造函數執行了父類構造函數,而後子類原型上實例化父類就是組合模式。如此,組合式繼承就融合了原型鏈繼承和構造函數繼承的優勢,而且過濾了其缺點。