Javascript繼承實現方式
1.對象冒充方式:
a.能夠實現多繼承
b.子類的新屬性及新方法必須在父類對應的臨時方法執行及刪除後才能夠添加,否則會被父類覆蓋。
c.只能繼承通過構造函數this.方式定義的屬性及方法,不能繼承通過原型方式prototype.定義的屬性及方法
d.不能使用instanceof來檢驗子類對象與父類的關係。
function ClassA(){
this.prop1 = "aaaa";
...
this.method1 = function(){...};
};
ClassA.prototype.method2 = function(){
....
};
function ClassB(){
this.tempMethod = classA;
this.tempMethod();
delete this.tempMethod;
this.propb = "asdf";
};
var obj = new ClassB();
obj.prop1 = "asdf"; //ok
obj.propb = "asdfa"; //ok
obj.method1(); //ok
obj.method2(); //error
2.call方式:針對對象冒充方式設置的一個函數,爲了簡化其實現,所以優缺點完全如同1.
function ClassA(val1,val2){
this.prop1 = val1;
this.prop2 = val2;
....
this.method1 = function(){...};
};
function ClassB(val1,val2,valb){
//this.tempMethod = classA;
//this.tempMethod();
//delete this.tempMethod;
ClassA.call(this,val1,val2);
this.propb = valb;
};
3.apply方式:call方式的一個變形用法,唯一的區別是call方式可以自由傳遞參數而apply只能傳遞一個參數數組或者arguments本身,參數數組或者arguments本身的順序必須與方法的參數順序一致。
4.原型鏈方式:
a.解決對象冒充方式不能繼承父類通過原型prototype方式定義的方法及屬性。
b.父類屬性方法不管是用構造函數this.定義還是原型方式定義都能被子類繼承到。
c.子類的通過原型方式定義的屬性及方法必須在ChildClass.prototype = new ParentClass();語句後定義,否則會被清空。
d.支持instanceof方法
e.不支持多重繼承。
f.原型鏈繼承方式的缺陷:父類構造函數必須沒有參數且不能實現多種繼承。
function ClassA()
{
this.prop1 = "aaa";
...
}
ClassA.prototype.method1 = function(){....};
function ClassB(){
this.propB = "bbb";
...
}
ClassB.prototype = new ClassA();
ClassB.prototype.propc = "asd";
ClassB.prototype.method2 = function(){...};
var objB = new ClassB();
objB.prop1 = "adsfasd"; //ok
objB.method1(); //ok
objB.method2(); //ok
5.混合方式:集合對象冒充方式及原型鏈方式來解決父類構造方法沒有參數的缺陷,是比較完美的繼承解決方案。
function ClassA(val1,val2)
{
this.prop1 = val1;
this.prop2 = val2;
...
}
ClassA.prototype.method1 = function(){....};
function ClassB(val1,val2,valb){
ClassA.call(this,val1,val2);
this.propB = valb;
...
}
ClassB.prototype = new ClassA();
ClassB.prototype.propc = "asd";
ClassB.prototype.method2 = function(){...};
var objB = new ClassB();
objB.prop1 = "adsfasd"; //ok
objB.method1(); //ok
objB.method2(); //ok
a.能夠實現多繼承
b.子類的新屬性及新方法必須在父類對應的臨時方法執行及刪除後才能夠添加,否則會被父類覆蓋。
c.只能繼承通過構造函數this.方式定義的屬性及方法,不能繼承通過原型方式prototype.定義的屬性及方法
d.不能使用instanceof來檢驗子類對象與父類的關係。
function ClassA(){
this.prop1 = "aaaa";
...
this.method1 = function(){...};
};
ClassA.prototype.method2 = function(){
....
};
function ClassB(){
this.tempMethod = classA;
this.tempMethod();
delete this.tempMethod;
this.propb = "asdf";
};
var obj = new ClassB();
obj.prop1 = "asdf"; //ok
obj.propb = "asdfa"; //ok
obj.method1(); //ok
obj.method2(); //error
2.call方式:針對對象冒充方式設置的一個函數,爲了簡化其實現,所以優缺點完全如同1.
function ClassA(val1,val2){
this.prop1 = val1;
this.prop2 = val2;
....
this.method1 = function(){...};
};
function ClassB(val1,val2,valb){
//this.tempMethod = classA;
//this.tempMethod();
//delete this.tempMethod;
ClassA.call(this,val1,val2);
this.propb = valb;
};
3.apply方式:call方式的一個變形用法,唯一的區別是call方式可以自由傳遞參數而apply只能傳遞一個參數數組或者arguments本身,參數數組或者arguments本身的順序必須與方法的參數順序一致。
4.原型鏈方式:
a.解決對象冒充方式不能繼承父類通過原型prototype方式定義的方法及屬性。
b.父類屬性方法不管是用構造函數this.定義還是原型方式定義都能被子類繼承到。
c.子類的通過原型方式定義的屬性及方法必須在ChildClass.prototype = new ParentClass();語句後定義,否則會被清空。
d.支持instanceof方法
e.不支持多重繼承。
f.原型鏈繼承方式的缺陷:父類構造函數必須沒有參數且不能實現多種繼承。
function ClassA()
{
this.prop1 = "aaa";
...
}
ClassA.prototype.method1 = function(){....};
function ClassB(){
this.propB = "bbb";
...
}
ClassB.prototype = new ClassA();
ClassB.prototype.propc = "asd";
ClassB.prototype.method2 = function(){...};
var objB = new ClassB();
objB.prop1 = "adsfasd"; //ok
objB.method1(); //ok
objB.method2(); //ok
5.混合方式:集合對象冒充方式及原型鏈方式來解決父類構造方法沒有參數的缺陷,是比較完美的繼承解決方案。
function ClassA(val1,val2)
{
this.prop1 = val1;
this.prop2 = val2;
...
}
ClassA.prototype.method1 = function(){....};
function ClassB(val1,val2,valb){
ClassA.call(this,val1,val2);
this.propB = valb;
...
}
ClassB.prototype = new ClassA();
ClassB.prototype.propc = "asd";
ClassB.prototype.method2 = function(){...};
var objB = new ClassB();
objB.prop1 = "adsfasd"; //ok
objB.method1(); //ok
objB.method2(); //ok
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.