做者:LylBrave 來源:CSDN 原文:blog.csdn.net/qq_25461519…bash
瞭解繼承的前提是瞭解原型鏈。原型鏈是每個實例對象都有一個__proto__屬性(隱式原型),在js內部用來查找原型鏈;每個構造函數都有prototype屬性(顯示原型),用來顯示修改對象的原型,實例.proto=構造函數.prototype=原型。原型鏈的特色就是:經過實例.__proto__查找原型上的屬性,從子類一直向上查找對象原型的屬性,繼而造成一個查找鏈即原型鏈。app
主要利用sub.prototype = new super, 這樣連通了子類-子類原型-父類。函數
//父類,帶屬性
function Super(){
this.flag = true;
}
//爲了提升複用性,方法綁定在父類原型屬性上
Super.prototype.getFlag = function() {
return this.flag;
}
//子類
function Sub() {
this.subFlag = false;
}
//實現繼承
Sub.prototype = new Super;
//給子類添加子類特有的方法,注意順序在繼承以後
Sub.prototype.getSubFlag = function() {
return this.sunFlag;
}
//構造實例
var es5 = new Sub;
console.log(es5)
複製代碼
缺點:性能
在構造子類構造函數時內部使用call或apply來調用父類的構造函數。ui
function Super(){
this.flag = true;
}
function Sub() {
Super.call(this)//若是父類能夠須要接收參數,這裏也能夠直接傳遞
}
var obj = new Sub();
obj.flag = false;
var obj2 = new Sub();
console.log(obj2.flag)//依然是true,不會相互影響
複製代碼
特色:this
缺點:es5
利用構造函數和原型鏈的方法,能夠比較完美的實現繼承spa
function Super(){
this.flag = true;
}
Super.prototype.getFlag = function() {
return this.flag;
}
function Sub() {
this.subFlag = false;
Super.call(this)
}
Sub.prototype = new Super;
var obj = new Sub();
Sub.prototype.constructor = sub;
Super.prototype.getSubFlag = function() {
return this.flag;
}
這裏還有個小問題,Sub.prototype = new Super; 會致使Sub.prototype的constructor指向Super;然而constructor的定義是要指向原型屬性對應的構造函數的,Sub.prototype是Sub構造函數的原型,因此應該添加一句糾正:Sub.prototype.constructor = Sub;
複製代碼
特色:.net
缺點:prototype
即將sub.prototype=new super改成sub.prototype=Object.creat(supper.prototype),避免了組合繼承中構造函數調用了兩次的弊端