javascript實(shí)現(xiàn)面向?qū)ο箢?lèi)的功能書(shū)寫(xiě)技巧
更新時(shí)間:2010年03月07日 12:19:14 作者:
經(jīng)過(guò)前段時(shí)間,學(xué)習(xí)《ajax完全自學(xué)手冊(cè)》后,才知道javascript原來(lái)還可以這么寫(xiě)。
學(xué)過(guò)java,c#,vb的都知道類(lèi)的概念,而類(lèi)具有繼承、封裝、多態(tài)等功能。而javascript它不是面向?qū)ο笳Z(yǔ)言,它是解釋性語(yǔ)言。
但我們同樣可以使用javascript來(lái)實(shí)現(xiàn)繼承、多態(tài)。
javascript實(shí)現(xiàn)類(lèi),有多種方法。
方法一:構(gòu)造方法。
代碼
function coder(){
this.name = '小王';
this.job = '程序員';
this.coding = function ()
{
alert('我正在寫(xiě)代碼');
}
}
var coder=new coder();
alert(coder.name);
coder.coding();
方法二:工廠方法。
代碼
function createCoderFactory(){
var obj=new Object();
obj.name = '小王';
obj.job = '程序員';
obj.coding = function (){
alert('我正在寫(xiě)代碼');
};
return obj;
}
var coder = createCoderFactory();
alert(coder.name);
coder.coding();
但工廠方法和構(gòu)造方法都有著一個(gè)相同的缺點(diǎn),就是每創(chuàng)建一個(gè)實(shí)例,都會(huì)實(shí)例化該類(lèi)的每個(gè)函數(shù)。
方法三:原形鏈。
代碼
function coder(){}
coder.prototype.name = '小王';
coder.prototype.job = '程序員';
coder.prototype.coding = function(){
alert('我正在寫(xiě)代碼');
};
var coder = new coder();
alert(coder.name);
coder.coding();
注意:書(shū)上說(shuō):原型鏈有個(gè)缺點(diǎn)就是它所有屬性都共享,只要一個(gè)實(shí)例改變其他的都會(huì)跟著改變。 測(cè)試如下:
var coder1 = new coder();
var coder2 = new coder();
alert(coder1.name); /*顯示“小王”*/
coder2.name = '老王';
alert(coder1.name); /*這個(gè)顯示“小王” 如果按書(shū)上說(shuō)的應(yīng)該是顯示"老王"*/
alert(coder2.name); /*這個(gè)顯示“老王”*/
alert(coder1.name);如果按書(shū)上說(shuō)的應(yīng)該是顯示"老王",但這里顯示的是“小王”,所以書(shū)上出錯(cuò)了。
方法四:混合方式。
以上三種都有著各自的缺點(diǎn),所以我們要加以改進(jìn)。
function coder(){
this.name = '小王';
this.job = '程序員';
}
coder.prototype.coding = function(){
alert('我正在寫(xiě)代碼');
};
方法五:動(dòng)態(tài)原鏈。
要解決前三種的缺點(diǎn),還有一種方法。
代碼
function coder(){
this.name = '小王';
this.job = '程序員';
if (typeof(coder._init) == 'undefined'){
this.coding = function ()
{
alert('我正在寫(xiě)代碼');
};
this._init = true;
}
}
這個(gè)方法呢,當(dāng)?shù)谝淮问褂脮r(shí),由于_init沒(méi)初始化,就會(huì)執(zhí)行以下的代碼,實(shí)例化coding函數(shù)。以后就不會(huì)再執(zhí)行,這樣就只實(shí)例化函數(shù)一次。
但我們同樣可以使用javascript來(lái)實(shí)現(xiàn)繼承、多態(tài)。
javascript實(shí)現(xiàn)類(lèi),有多種方法。
方法一:構(gòu)造方法。
代碼
復(fù)制代碼 代碼如下:
function coder(){
this.name = '小王';
this.job = '程序員';
this.coding = function ()
{
alert('我正在寫(xiě)代碼');
}
}
var coder=new coder();
alert(coder.name);
coder.coding();
方法二:工廠方法。
代碼
復(fù)制代碼 代碼如下:
function createCoderFactory(){
var obj=new Object();
obj.name = '小王';
obj.job = '程序員';
obj.coding = function (){
alert('我正在寫(xiě)代碼');
};
return obj;
}
var coder = createCoderFactory();
alert(coder.name);
coder.coding();
但工廠方法和構(gòu)造方法都有著一個(gè)相同的缺點(diǎn),就是每創(chuàng)建一個(gè)實(shí)例,都會(huì)實(shí)例化該類(lèi)的每個(gè)函數(shù)。
方法三:原形鏈。
代碼
復(fù)制代碼 代碼如下:
function coder(){}
coder.prototype.name = '小王';
coder.prototype.job = '程序員';
coder.prototype.coding = function(){
alert('我正在寫(xiě)代碼');
};
var coder = new coder();
alert(coder.name);
coder.coding();
注意:書(shū)上說(shuō):原型鏈有個(gè)缺點(diǎn)就是它所有屬性都共享,只要一個(gè)實(shí)例改變其他的都會(huì)跟著改變。 測(cè)試如下:
復(fù)制代碼 代碼如下:
var coder1 = new coder();
var coder2 = new coder();
alert(coder1.name); /*顯示“小王”*/
coder2.name = '老王';
alert(coder1.name); /*這個(gè)顯示“小王” 如果按書(shū)上說(shuō)的應(yīng)該是顯示"老王"*/
alert(coder2.name); /*這個(gè)顯示“老王”*/
alert(coder1.name);如果按書(shū)上說(shuō)的應(yīng)該是顯示"老王",但這里顯示的是“小王”,所以書(shū)上出錯(cuò)了。
方法四:混合方式。
以上三種都有著各自的缺點(diǎn),所以我們要加以改進(jìn)。
復(fù)制代碼 代碼如下:
function coder(){
this.name = '小王';
this.job = '程序員';
}
coder.prototype.coding = function(){
alert('我正在寫(xiě)代碼');
};
方法五:動(dòng)態(tài)原鏈。
要解決前三種的缺點(diǎn),還有一種方法。
代碼
復(fù)制代碼 代碼如下:
function coder(){
this.name = '小王';
this.job = '程序員';
if (typeof(coder._init) == 'undefined'){
this.coding = function ()
{
alert('我正在寫(xiě)代碼');
};
this._init = true;
}
}
這個(gè)方法呢,當(dāng)?shù)谝淮问褂脮r(shí),由于_init沒(méi)初始化,就會(huì)執(zhí)行以下的代碼,實(shí)例化coding函數(shù)。以后就不會(huì)再執(zhí)行,這樣就只實(shí)例化函數(shù)一次。
您可能感興趣的文章:
相關(guān)文章
JavaScript 設(shè)計(jì)模式學(xué)習(xí) Singleton
JavaScript設(shè)計(jì)模式學(xué)習(xí) Singleton2009-07-07JavaScript定義類(lèi)或函數(shù)的幾種方式小結(jié)
js中不論是定義類(lèi)或者函數(shù),很多朋友想將代碼寫(xiě)的更專(zhuān)業(yè),更方便擴(kuò)展等,那么就可以參考這篇文章了,最好是總結(jié),建議大家收藏下。2011-01-01javascript中類(lèi)的定義及其方式(《javascript高級(jí)程序設(shè)計(jì)》學(xué)習(xí)筆記)
javascript也是一種面向?qū)ο蟮木幊陶Z(yǔ)言。但是javascript中的類(lèi)相關(guān)的東西(類(lèi)的定義,原型鏈,繼承等)卻不是很好理解,特別是繼承。2011-07-07JavaScript 三種創(chuàng)建對(duì)象的方法
JavaScript中對(duì)象的創(chuàng)建有以下幾種方式 使用內(nèi)置對(duì)象 使用JSON符號(hào) 自定義對(duì)象構(gòu)造。大家可以參考下。2009-10-10JavaScript 使用簡(jiǎn)略語(yǔ)法創(chuàng)建對(duì)象的代碼
JavaScript 使用簡(jiǎn)略語(yǔ)法創(chuàng)建對(duì)象的代碼 ,需要的朋友可以參考下。2010-01-01Javascript面向?qū)ο髷U(kuò)展庫(kù)代碼分享
最近一直在用js做項(xiàng)目,遇到了許多需要應(yīng)用面向?qū)ο髞?lái)設(shè)計(jì)的功能,由于js對(duì)OOP的原生支持還不是很完善,所以就寫(xiě)了一個(gè)面向?qū)ο蟮臄U(kuò)展庫(kù)用做底層支持,現(xiàn)在把它單獨(dú)整理出來(lái),完善了一些功能,在這里分享一下2012-03-03Javascript面向?qū)ο笤O(shè)計(jì)一 工廠模式
工廠模式抽象了創(chuàng)建具體對(duì)象的過(guò)程,但是在ECMAScript中無(wú)法創(chuàng)建類(lèi),所以就使用一種函數(shù)來(lái)封裝以特定接口創(chuàng)建對(duì)象的細(xì)節(jié)2011-12-12