原文出處:http://www.tkk7.com/ilovezmh/archive/2007/04/16/111106.html
一、繼承的方式
1.對(duì)象冒充
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();
所有新的屬性和新的方法都必須在刪除了新方法的代碼行后定義。否則,可能會(huì)覆蓋超類的相關(guān)屬性和方法。
對(duì)象冒充可以支持多繼承。
function ClassZ(){
this.newMethod = ClassX;
this.newMethod(sColor);
delete this.newMethod;
this.newMethod = ClassY;
this.newMethod(sColor);
delete this.newMethod;
}
這里存在一個(gè)弊端,如果ClassX和ClassY具有相同的屬性或方法,ClassY具有高優(yōu)先級(jí),因?yàn)槔^承的是最后的類。
2.call()方法
call()方法是與經(jīng)典的對(duì)象冒充方法最相似的方法,它的第一個(gè)參數(shù)用作this的對(duì)象,其他參數(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()方法有兩個(gè)參數(shù),用作this的對(duì)象和要傳遞參數(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í)才可以傳遞參數(shù)對(duì)象。如果不是,就必須創(chuàng)建一個(gè)單獨(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í),沒有給它傳遞參數(shù)。這在原型鏈中是標(biāo)準(zhǔn)做法。要確保構(gòu)造函數(shù)沒有任何參數(shù)。
原型鏈的弊端是不支持多重繼承。
5.混合方式
與創(chuàng)建對(duì)象最好方式相似,用對(duì)象冒充繼承構(gòu)造函數(shù)的屬性,用原型鏈繼承prototype對(duì)象的方法。
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庫(kù)
可以從
http://www.nczonline.net/downloads處下載
zInherit庫(kù)給Object類添加了兩個(gè)方法,inheritFrom()和instanceOf()
ClassB.prototype.inheritFrom(ClassA);
CalssB.instanceOf(ClassA);
2.xbObjects庫(kù)
可以從
http://archive.bclary.com/xbprojectsdocs/xbobject/處下載
第一步,必須注冊(cè)類。
_classes.registerClass("Subclass_Name","Superclass_Name");
這里,子類和超類名都以字符串形式傳進(jìn)來(lái),而不是指向它們的構(gòu)造函數(shù)的指針。這個(gè)調(diào)用必須放在指定子類的構(gòu)造構(gòu)函數(shù)前。
第二步,在構(gòu)造函數(shù)內(nèi)調(diào)用defineClass()方法,傳給它類名及被Clary稱為原型函數(shù)的指針,該函數(shù)用于初始化對(duì)象的所有屬性和方法。
如
_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的實(shí)例
var objA = new ClassA("red");
objA.sayColor(); //outputs "res"
posted on 2007-04-19 15:41
cresposhi 閱讀(1227)
評(píng)論(1) 編輯 收藏