国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

javaScript中定義類或?qū)ο蟮奈宸N方式總結(jié)

2024-05-06 16:33:22
字體:
供稿:網(wǎng)友

第一種方式: 工廠方法

能創(chuàng)建并返回特定類型的對象的工廠函數(shù)(factory function)。

 function createCar(sColor){  var oTempCar = new Object;  oTempCar.color = sColor;  oTempCar.showColor = function (){  alert(this.color);  };  return oTempCar;  }  var oCar1 = createCar();  var oCar2 = createCar(); 

調(diào)用此函數(shù)時,將創(chuàng)建新對象,并賦予它所有必要的屬性。使用此方法將創(chuàng)建car對象的兩個版本(oCar1和oCar2),他們的屬性完全一樣。

使用此方法存在的問題:

1語義上看起來不像使用帶有構(gòu)造函數(shù)的new運算符那么正規(guī)。

2使用這種方式必須創(chuàng)建對象的方法。每次調(diào)用createCar(),都要創(chuàng)建showColor(),意味著每個對象都有自己的showColor()版本,事實上,每個對象都共享了同一個函數(shù)。

有些開發(fā)者在工廠函數(shù)外定義對象的方法,然后通過屬性指向該方法。從而避免這個問題:

function createCar(sColor){ var oTempCar = new Object; oTempCar.color = sColor; oTempCar.showColor = showColor; return oTempCar; } function showColor(){ alert(this.color); }

在這段重寫的代碼中,在函數(shù)createCar()前定義了函數(shù)showColor().在createCar()內(nèi)部,賦予對象一個已經(jīng)指向已經(jīng)存在的showColor()函數(shù)的指針。從功能上來講,這樣解決了重復(fù)創(chuàng)建對象的問題,但該函數(shù)看起來不像對象的方法。

所有這些問題引發(fā)了開發(fā)者定義的構(gòu)造函數(shù)的出現(xiàn)。

第二種方式:構(gòu)造函數(shù)方式

function Car(sColor){ this.color = sColor; this.showColor = function (){ alert(this.color); }; } var oCar1 = new Car("red"); var oCar2 = new Car("blue"); 
你可能已經(jīng)注意到第一個差別了,在構(gòu)造函數(shù)內(nèi)部無創(chuàng)建對象,而是使用this關(guān)鍵字。使用new運算符調(diào)用構(gòu)造函數(shù)時,在執(zhí)行第一行代碼前先創(chuàng)建一個對象,只有用this才能訪問該對象。然后可以直接賦予this屬性,默認(rèn)情況下是構(gòu)造函數(shù)的返回值(不必明確使用return運算符)。

這種方式在管理函數(shù)方面與工廠方法一樣都存在相同的問題。

第三種方式:原型方式

function Car(){ } Car.prototype.color = "blue"; var oCar1 = new Car(); var oCar2 = new Car(); 

調(diào)用new Car()時,原型的所有屬性都被立即賦予要創(chuàng)建的對象,意味著所有的Car實例存放的都是指向showColor()函數(shù)的指針。從語義上看起來都屬于一個對象,因此解決了前面兩種方式存在的兩個問題。此外使用該方法,還能用instanceof運算符檢查給定變量指向的對象類型。因此,下面的代碼將輸出true:

alert(oCar instanceof Car); //outputs "true"

這個方式看起來很不錯,遺憾的是,它并不盡如人意。

1首先這個構(gòu)造函數(shù)沒有參數(shù)。使用原型方式時,不能給構(gòu)造函數(shù)傳遞參數(shù)初始化屬性的值,因為car1和car2的屬性都等于“red”。

2真正的問題出現(xiàn)在屬性指向的是對象,而不是函數(shù)時。函數(shù)共享不會造成任何問題,但是對象卻很少被多個實例共享的。

第四種方式:混合的構(gòu)造函數(shù)/原型方式(推薦)

聯(lián)合使用構(gòu)造函數(shù)和原型方式,就可像用其他程序設(shè)計語言一樣創(chuàng)建對象。這種概念非常簡單,即用構(gòu)造函數(shù)定義對象的所有非函數(shù)屬性,用原型方式定義對象的函數(shù)屬性(方法)。

function Car(sColor){ this.color =sColor; this.drivers =new Array("Mike","Sue"); } Car.prototype.showColor = function(){ alert(this.color); } var oCar1 =new Car("red"); var oCar2 =new Car("blue"); oCar1.drivers.push("Matt"); alert(oCar1.drivers); //outputs "Mike,Sue,Matt" alert(oCar1.drivers); //outputs "Mike,Sue" 

第五種方式:動態(tài)原型方式(推薦)

對于習(xí)慣使用其他語言的開發(fā)者來說,使用混合的構(gòu)造函數(shù)/原型方式感覺不那么和諧。批評混合的構(gòu)造函數(shù)/原型方式的人認(rèn)為,在構(gòu)造函數(shù)內(nèi)找屬性,在外部找方法的做法很不合理。所以他們設(shè)計了動態(tài)原型方式,以提供更友好的編碼風(fēng)格。

動態(tài)原型方法的基本想法與混合的構(gòu)造函數(shù)/原型方式相同,即在構(gòu)造函數(shù)內(nèi)定義非函數(shù)屬性,而函數(shù)屬性則利用原型屬性定義。唯一的區(qū)別是賦予對象方法的位置。下面是使用動態(tài)原型方法重寫的Car類:

function Car(sColor){ this.color =sColor; this.drivers =new Array("Mike","Sue"); if(typeof Car._initialized == "undefined"){ Car.prototype.showColor = function(){ alert(this.color); } } Car._initialized = true; } 

以上這篇javaScript中定義類或?qū)ο蟮奈宸N方式總結(jié)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 万荣县| 溆浦县| 漠河县| 陆丰市| 白朗县| 扶沟县| 湟中县| 泸溪县| 崇信县| 龙山县| 石门县| 旬阳县| 合阳县| 夏邑县| 深圳市| 承德市| 青海省| 沧州市| 孟州市| 紫云| 马公市| 武乡县| 汶川县| 武宁县| 永昌县| 卓资县| 贵州省| 东丽区| 西平县| 潜江市| 汶上县| 北流市| 年辖:市辖区| 潮州市| 南木林县| 修文县| 灵武市| 友谊县| 苍山县| 邓州市| 白城市|