一、繼承的方式
1.對象冒充
function ClassA(sColor) {
this.color = sColor;
this.sayColor = function () {
alert(this.color);
};
}
function ClassB(sColor, sName) {
this.newMethod = ClassA;
this.newMethod(sColor);
delete this.newMethod;
this.name = sName;
this.sayName = function () {
alert(this.name);
};
}
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
所有新的屬性和新的方法都必須在刪除了新方法的代碼行后定義。否則,可能會覆蓋超類的相關(guān)屬性和方法。
對象冒充可以支持多繼承。
function ClassZ(){
this.newMethod = ClassX;
this.newMethod(sColor);
delete this.newMethod;
this.newMethod = ClassY;
this.newMethod(sColor);
delete this.newMethod;
}
這里存在一個弊端,如果ClassX和ClassY具有相同的屬性或方法,ClassY具有高優(yōu)先級,因為繼承的是最后的類。
2.call()方法
call()方法是與經(jīng)典的對象冒充方法最相似的方法,它的第一個參數(shù)用作this的對象,其他參數(shù)都直接傳遞函數(shù)自身。
function ClassA(sColor) {
this.color = sColor;
this.sayColor = function () {
alert(this.color);
};
}
function ClassB(sColor, sName) {
//this.newMethod = ClassA;
//this.newMethod(color);
//delete this.newMethod;
ClassA.call(this, sColor);
this.name = sName;
this.sayName = function () {
alert(this.name);
};
}
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
3.apply()方法
apply()方法有兩個參數(shù),用作this的對象和要傳遞參數(shù)的數(shù)組。例如:
function ClassA(sColor) {
this.color = sColor;
this.sayColor = function () {
alert(this.color);
};
}
function ClassB(sColor, sName) {
//this.newMethod = ClassA;
//this.newMethod(color);
//delete this.newMethod;
ClassA.apply(this, arguments);
this.name = sName;
this.sayName = function () {
alert(this.name);
};
}
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
當(dāng)然,只有超類中的參數(shù)順序與子類中的參數(shù)順序完全一致時才可以傳遞參數(shù)對象。如果不是,就必須創(chuàng)建一個單獨(dú)的數(shù)組,按照正確的順序放置參數(shù)。此外,還可以使用call()方法。
4.原型鏈
function ClassA() {
}
ClassA.prototype.color = "red";
ClassA.prototype.sayColor = function () {
alert(this.color);
};
function ClassB() {
}
ClassB.prototype = new ClassA();
ClassB.prototype.name = "";
ClassB.prototype.sayName = function () {
alert(this.name);
};
var objA = new ClassA();
var objB = new ClassB();
objA.color = "red";
objB.color = "blue";
objB.name = "Nicholas";
objA.sayColor();
objB.sayColor();
objB.sayName();
注意,調(diào)用ClassA的構(gòu)造函數(shù)時,沒有給它傳遞參數(shù)。這在原型鏈中是標(biāo)準(zhǔn)做法。要確保構(gòu)造函數(shù)沒有任何參數(shù)。
原型鏈的弊端是不支持多重繼承。
5.混合方式
與創(chuàng)建對象最好方式相似,用對象冒充繼承構(gòu)造函數(shù)的屬性,用原型鏈繼承prototype對象的方法。
function ClassA(sColor) {
this.color = sColor;
}
ClassA.prototype.sayColor = function () {
alert(this.color);
};
function ClassB(sColor, sName) {
ClassA.call(this, sColor);
this.name = sName;
}
ClassB.prototype = new ClassA();
ClassB.prototype.sayName = function () {
alert(this.name);
};
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
二、其他繼承方式
1.zlnherit庫
可以從
http://www.nczonline.net/downloads處下載
zInherit庫給Object類添加了兩個方法,inheritFrom()和instanceOf()
ClassB.prototype.inheritFrom(ClassA);
CalssB.instanceOf(ClassA);
2.xbObjects庫
可以從
這里,子類和超類名都以字符串形式傳進(jìn)來,而不是指向它們的構(gòu)造函數(shù)的指針。這個調(diào)用必須放在指定子類的構(gòu)造構(gòu)函數(shù)前。
第二步,在構(gòu)造函數(shù)內(nèi)調(diào)用defineClass()方法,傳給它類名及被Clary稱為原型函數(shù)的指針,該函數(shù)用于初始化對象的所有屬性和方法。
如
_classes.registerClass("ClassA");
function ClassA(color){
_classes.defineClass("ClassA",prototypeFunction);
function prototypeFunction(){
//...
}
}
第三步,為該類創(chuàng)建init()方法。該方法負(fù)責(zé)設(shè)置該類的所有屬性,它必須接受與構(gòu)造函數(shù)相同的參數(shù)。作為一種規(guī)約,init()方法總是在defineClass()方法后調(diào)用。
_classes.registerClass("ClassA");
function ClassA(color){
_classes.defineClass("ClassA",prototypeFunction);
this.init(sColor);
function prototypeFunction(){
ClassA.prototype.init = function(sColor){
this.parentMethod("init");
this.color = sColor;
}
}
}
第四步,在原型函數(shù)內(nèi)添加其他類的方法。
_classes.registerClass("ClassA");
function ClassA(color){
_classes.defineClass("ClassA",prototypeFunction);
this.init(sColor);
function prototypeFunction(){
ClassA.prototype.init = function(sColor){
this.parentMethod("init");
this.color = sColor;
}
ClassA.prototype.sayColor = function(){
alert(this.color);
}
}
}
然后,即可以以常規(guī)方式創(chuàng)建ClassA的實例
var objA = new ClassA("red");
objA.sayColor(); //outputs "res"
posted on 2007-04-16 23:24
小祝 閱讀(944)
評論(4) 編輯 收藏 所屬分類:
Javascript