javascript 混合的構(gòu)造函數(shù)和原型方式,動(dòng)態(tài)原型方式
更新時(shí)間:2009年12月07日 19:51:35 作者:
JS編程中最常用兩種對(duì)象類定義的方式。不管是利用下面2種方式的那一種,都可以達(dá)到相同的效果!
我們?nèi)粘S編程中最常用的方式 有下面2種:
1.混合的構(gòu)造函數(shù)和原型方式 (重點(diǎn))
function car (sColor,iNumbers){ // 構(gòu)造函數(shù)只用來定義對(duì)象的所有非函數(shù)屬性,即對(duì)象的屬性
this.color = sColor;
this.numbers = iNumbers;
this.dirvers = new Array ("Jone","Leon");
}
car.prototype.showColor = function (){ // 原型方式只用來定義對(duì)象的所有函數(shù)屬性,即對(duì)象的方法
alert(this.color);
}
var car1 = new car("red");
var car2 = new car("yellow");
car1.showColor)();
car2.showColor)();
總結(jié):當(dāng)你創(chuàng)建(new)一個(gè)新的對(duì)象實(shí)例car1和car2的時(shí)候,car1和car2都繼承函數(shù)對(duì)象car的所有的非函數(shù)屬性;此時(shí)在car函數(shù)外面給car函數(shù)對(duì)象的原型里面生成一個(gè)showColor方法,此時(shí)car1和car2都會(huì)引用car的原型里面的showColor方式,如果把原型方法放進(jìn)car函數(shù)體里面,那么此時(shí)car1和car2不是引用的關(guān)系,而是每執(zhí)行一次函數(shù),就構(gòu)建一次showColor函數(shù),如果有100個(gè)car,那么就要重復(fù)構(gòu)造100個(gè)函數(shù)。所以要把非函數(shù)屬性和函數(shù)屬性分開來寫。
2.動(dòng)態(tài)原型方式 (重點(diǎn))
function car (sColor,iNumbers){ // 構(gòu)造函數(shù)只用來定義對(duì)象的所有非函數(shù)屬性,即對(duì)象的屬性
this.color = sColor;
this.numbers = iNumbers;
this.dirvers = new Array ("Jone","Leon");
if(typeof car._initialized=="undefined"){ //此時(shí)此刻,這里的car._initialized成立,繼續(xù)執(zhí)行下面的函數(shù)
car.prototype.showColor = function (){
alert(this.color);
}
}
car._initialized = true; //
執(zhí)行到這里就停止再也不在執(zhí)行第二次,因?yàn)榇藭r(shí)此刻,car._initialized只是函數(shù)的屬性,而不是函數(shù)對(duì)象的原型屬性,如果是原型屬性的話,new一個(gè)函數(shù)對(duì)象的實(shí)例,就會(huì)改變函數(shù)里面原型對(duì)象的屬性,那么就會(huì)重復(fù)構(gòu)造showColor這個(gè)函數(shù)。正因?yàn)槭沁@個(gè)原因,當(dāng)car._initialized等于undefined的時(shí)候,執(zhí)行一次showColor,最后得到的car._initialized=true,這個(gè)時(shí)候改變的是函數(shù)的屬性,而不是函數(shù)原型的屬性,所以外部new一個(gè)對(duì)象實(shí)例根本無(wú)法改變函數(shù)的屬性,所有紅色部分的代碼就是為了做一件事情:只執(zhí)行紅色代碼之間的方法,并且每種方法只有一次,不會(huì)重復(fù)執(zhí)行!
}
var car1 = new car ("red");
var car2 = new car ("yellow");
car1.showColor();
car2.showColor();
總結(jié):不管是利用上面2種方式的那一種,都可以達(dá)到相同的效果!
方法1:混合的構(gòu)造函數(shù)和原型方式,相當(dāng)于把非函數(shù)屬性和一般屬性分開來寫,這樣new 新對(duì)象的時(shí)候,不會(huì)重復(fù)構(gòu)造新函數(shù),此時(shí)引用的知識(shí)函數(shù)對(duì)象的原型方法和函數(shù)對(duì)象的屬性。但是,代碼看起來沒有封裝起來而且,不影響任何東西。
方法2:完全利用JAVA的編程代碼風(fēng)格來實(shí)現(xiàn)JS的編程。這樣的好處是讓整個(gè)函數(shù)看起來像是把屬性和方法都“封裝”在一個(gè)函數(shù)體內(nèi),看起來更像一個(gè)“類”。(溫故知新:JS中其實(shí)沒有類,你要說有類,就可以把它看做一個(gè)function類),缺點(diǎn)是在于利用if()語(yǔ)句看起來不是很友好而已。
1.混合的構(gòu)造函數(shù)和原型方式 (重點(diǎn))
復(fù)制代碼 代碼如下:
function car (sColor,iNumbers){ // 構(gòu)造函數(shù)只用來定義對(duì)象的所有非函數(shù)屬性,即對(duì)象的屬性
this.color = sColor;
this.numbers = iNumbers;
this.dirvers = new Array ("Jone","Leon");
}
car.prototype.showColor = function (){ // 原型方式只用來定義對(duì)象的所有函數(shù)屬性,即對(duì)象的方法
alert(this.color);
}
var car1 = new car("red");
var car2 = new car("yellow");
car1.showColor)();
car2.showColor)();
總結(jié):當(dāng)你創(chuàng)建(new)一個(gè)新的對(duì)象實(shí)例car1和car2的時(shí)候,car1和car2都繼承函數(shù)對(duì)象car的所有的非函數(shù)屬性;此時(shí)在car函數(shù)外面給car函數(shù)對(duì)象的原型里面生成一個(gè)showColor方法,此時(shí)car1和car2都會(huì)引用car的原型里面的showColor方式,如果把原型方法放進(jìn)car函數(shù)體里面,那么此時(shí)car1和car2不是引用的關(guān)系,而是每執(zhí)行一次函數(shù),就構(gòu)建一次showColor函數(shù),如果有100個(gè)car,那么就要重復(fù)構(gòu)造100個(gè)函數(shù)。所以要把非函數(shù)屬性和函數(shù)屬性分開來寫。
2.動(dòng)態(tài)原型方式 (重點(diǎn))
復(fù)制代碼 代碼如下:
function car (sColor,iNumbers){ // 構(gòu)造函數(shù)只用來定義對(duì)象的所有非函數(shù)屬性,即對(duì)象的屬性
this.color = sColor;
this.numbers = iNumbers;
this.dirvers = new Array ("Jone","Leon");
if(typeof car._initialized=="undefined"){ //此時(shí)此刻,這里的car._initialized成立,繼續(xù)執(zhí)行下面的函數(shù)
car.prototype.showColor = function (){
alert(this.color);
}
}
car._initialized = true; //
執(zhí)行到這里就停止再也不在執(zhí)行第二次,因?yàn)榇藭r(shí)此刻,car._initialized只是函數(shù)的屬性,而不是函數(shù)對(duì)象的原型屬性,如果是原型屬性的話,new一個(gè)函數(shù)對(duì)象的實(shí)例,就會(huì)改變函數(shù)里面原型對(duì)象的屬性,那么就會(huì)重復(fù)構(gòu)造showColor這個(gè)函數(shù)。正因?yàn)槭沁@個(gè)原因,當(dāng)car._initialized等于undefined的時(shí)候,執(zhí)行一次showColor,最后得到的car._initialized=true,這個(gè)時(shí)候改變的是函數(shù)的屬性,而不是函數(shù)原型的屬性,所以外部new一個(gè)對(duì)象實(shí)例根本無(wú)法改變函數(shù)的屬性,所有紅色部分的代碼就是為了做一件事情:只執(zhí)行紅色代碼之間的方法,并且每種方法只有一次,不會(huì)重復(fù)執(zhí)行!
}
var car1 = new car ("red");
var car2 = new car ("yellow");
car1.showColor();
car2.showColor();
總結(jié):不管是利用上面2種方式的那一種,都可以達(dá)到相同的效果!
方法1:混合的構(gòu)造函數(shù)和原型方式,相當(dāng)于把非函數(shù)屬性和一般屬性分開來寫,這樣new 新對(duì)象的時(shí)候,不會(huì)重復(fù)構(gòu)造新函數(shù),此時(shí)引用的知識(shí)函數(shù)對(duì)象的原型方法和函數(shù)對(duì)象的屬性。但是,代碼看起來沒有封裝起來而且,不影響任何東西。
方法2:完全利用JAVA的編程代碼風(fēng)格來實(shí)現(xiàn)JS的編程。這樣的好處是讓整個(gè)函數(shù)看起來像是把屬性和方法都“封裝”在一個(gè)函數(shù)體內(nèi),看起來更像一個(gè)“類”。(溫故知新:JS中其實(shí)沒有類,你要說有類,就可以把它看做一個(gè)function類),缺點(diǎn)是在于利用if()語(yǔ)句看起來不是很友好而已。
您可能感興趣的文章:
- Javascript使用function創(chuàng)建類的兩種方法(推薦)
- Javascript 創(chuàng)建類并動(dòng)態(tài)添加屬性及方法的簡(jiǎn)單實(shí)現(xiàn)
- JS創(chuàng)建類和對(duì)象的兩種不同方式
- JavaScript中創(chuàng)建類/對(duì)象的幾種方法總結(jié)
- JavaScript創(chuàng)建類/對(duì)象的幾種方式概述及實(shí)例
- javascript最常用與實(shí)用的創(chuàng)建類的代碼
- 利用MS AJAX注冊(cè)Javascript命名空間并創(chuàng)建類
- 討論javascript(一)工廠方式 js面象對(duì)象的定義方法
- javascript工廠方式定義對(duì)象
- JavaScript中使用構(gòu)造器創(chuàng)建對(duì)象無(wú)需new的情況說明
- JavaScript設(shè)計(jì)模式之工廠模式和構(gòu)造器模式
- JS常見創(chuàng)建類的方法小結(jié)【工廠方式,構(gòu)造器方式,原型方式,聯(lián)合方式等】
相關(guān)文章
JavaScript 類的定義和引用 JavaScript高級(jí)培訓(xùn) 自定義對(duì)象
在Java語(yǔ)言中,我們可以定義自己的類,并根據(jù)這些類創(chuàng)建對(duì)象來使用,在Javascript中,我們也可以定義自己的類,例如定義User類、Hashtable類等等。2010-04-04學(xué)習(xí)JS面向?qū)ο蟪晒?借國(guó)慶發(fā)布個(gè)最新作品與大家交流
學(xué)習(xí)JS面向?qū)ο蟪晒?,借?guó)慶發(fā)布個(gè)最新作品與大家交流,大家可以看下。2009-10-10

一實(shí)用的實(shí)現(xiàn)table排序的Javascript類庫(kù)
一實(shí)用的實(shí)現(xiàn)table排序的Javascript類庫(kù)...
2007-09-09 
收集的幾個(gè)不錯(cuò)的javascript類小例子
自己比較喜歡javascript類,主要是方便擴(kuò)展。
2007-12-12