欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript 繼承使用分析

 更新時(shí)間:2011年05月12日 01:17:25   作者:  
繼承,通俗地說(shuō),之前你寫(xiě)過(guò)一些類(lèi),這些類(lèi)中有一些是而你現(xiàn)在要寫(xiě)的類(lèi)的功能的子集或者基本相同,那么你不用完全重新寫(xiě)一個(gè)新的類(lèi),你可以把之前寫(xiě)的類(lèi)拿過(guò)來(lái)使用.這樣的一種代碼重用過(guò)程就叫做繼承
深入學(xué)習(xí)javascript繼承之前,先了解下面的幾個(gè)概念:
父類(lèi):被繼承的類(lèi)
子類(lèi):由繼承得來(lái)的類(lèi)
超類(lèi):也就是父類(lèi)
抽象類(lèi):一般不用來(lái)實(shí)例化的類(lèi),它的用途是用來(lái)給其他類(lèi)繼承.
基類(lèi):提供給其他類(lèi)可以繼承的類(lèi)
派生類(lèi):由基類(lèi)繼承而來(lái)的類(lèi)

javascript對(duì)象繼承通常有下面的5種方式:
1.對(duì)象冒充
2.call()方式
3.apply()方式
4.原型鏈
5.混合方式

A.對(duì)象冒充
所謂對(duì)象冒充,就是新的類(lèi)冒充舊的類(lèi)(舊的類(lèi)必須采用構(gòu)造函數(shù)方式),從而達(dá)到繼承目的.
eg.1
復(fù)制代碼 代碼如下:

function people(name,sex,age){ //使用構(gòu)造函數(shù)方式
this.name=name;
this.sex=sex;
this.age=age;
this.say=function(){
alert("My name is "+this.name);
};

this.doing=function(){
alert("I am speaking");
};
}
var Marry=new people("Marry","Woman","23");
Marry.say();
Marry.doing();

function white_people(name,sex,age){
this.inherit=people;
this.inherit(name,sex,age);
delete this.inherit;

this.area=function(){
alert("I am in Europe");
}
}
var Tom=new white_people("Tom","man","21");
Tom.say();
Tom.area();
alert(Tom.age);

上面的例子中,people是用來(lái)做white_people的基類(lèi),記住這個(gè)格式是用來(lái)對(duì)象冒充達(dá)到繼承目的的
this.inherit=people; //冒充
this.inherit(name,sex,age); //繼承
delete this.inherit; //刪除繼承
所有新屬性和新方法都必須再刪除了繼承后定義,這樣是為了避免覆蓋父類(lèi)的相關(guān)屬性和方法.
另外,對(duì)象冒充支持多繼承.
eg.2
復(fù)制代碼 代碼如下:

function worker(pay,work){
this.pay=pay;
this.work=work;
}
function city_worker(name,sex,age,pay,work){
this.inherit=people;
this.inherit(name,sex,age);
delete this.inherit;

this.inherit=worker;
this.inherit(pay,work);
delete this.inherit;
}

var Jerry=new city_worker("Jerry","man","21","$1000","coder");
Jerry.say();
alert(Jerry.work);

對(duì)象冒充有一個(gè)不足的地方:多繼承機(jī)制實(shí)現(xiàn)時(shí),如果基類(lèi)存在相同的屬性或者方法,將從后面的類(lèi)繼承.

B.call()方式
只是封裝的對(duì)象冒充的一個(gè)函數(shù).這樣,我們不再需要寫(xiě)"經(jīng)典"的三句話,而是用下面這句話代替:
基類(lèi).call(對(duì)象,參數(shù)列表)
eg.1
復(fù)制代碼 代碼如下:

function farmer(name,sex,age,pay,work){
people.call(this,name,sex,age);
worker.call(this,pay,work);
}

var Nicholas=new farmer("Nicholas","man","27","$3000","irrigator");
Nicholas.say();
alert(Nicholas.pay);

同樣,call()存在同名屬性和方法的小問(wèn)題.

C.apply()方式
和call()一樣.apply()也是對(duì)象冒充的一個(gè)封裝函數(shù).其格式為:
基類(lèi).apply(對(duì)象,參數(shù)數(shù)組);
eg.1
復(fù)制代碼 代碼如下:

function white_collar(name,sex,age,pay,work){
people.apply(this,new Array(name,sex,age));
worker.apply(this,[pay,work]);
}

var Jiessie=new white_collar("Jiessie","woman","26","$2500","editor");
Jiessie.say();
alert(Jiessie.work);

同樣,apply()存在同名屬性和方法的小問(wèn)題.

D.原型鏈
上面三種方式都是采用構(gòu)造函數(shù)方式的繼承,對(duì)應(yīng)地,也具有原型函數(shù)方式的繼承:原型鏈.
eg.1
復(fù)制代碼 代碼如下:

function blue_collar(){
}
blue_collar.prototype.name="Jean";
blue_collar.prototype.age="33";
blue_collar.prototype.say=function(){
alert("my name is "+ this.name);
};

function city_blue_collar(){
}
city_blue_collar.prototype=new blue_collar();

var jj=new city_blue_collar;
jj.say();

原型鏈也具有了原型鏈的缺點(diǎn):不能傳遞參數(shù).另外,原型鏈不支持多繼承,因?yàn)?

E.混合方式
使用構(gòu)造函數(shù)方式來(lái)寫(xiě)類(lèi)的屬性,對(duì)屬性的繼承采用call()或者apply()
使用原型方式來(lái)寫(xiě)的方法,對(duì)方法的繼承采用原型鏈
eg.1
復(fù)制代碼 代碼如下:

function beauty(name,age){
this.name=name;
this.age=age;
}
beauty.prototype.say=function(){
alert("小女叫"+this.name);
};

function china_beauty(name,age,area){
beauty.call(this,name,age);
this.area=area;
}
china_beauty.prototype=new beauty();
china_beauty.prototype.from=function(){
alert("我來(lái)自"+this.area);
};

var diaochan=new china_beauty("貂禪","16","臨洮");
diaochan.say();
diaochan.from();
alert(diaochan.age);

相關(guān)文章

最新評(píng)論