ECMAScript中的構(gòu)造函數(shù)可用來(lái)創(chuàng)建特定類型的對(duì)象。像Object和Array這樣的原生構(gòu)造函數(shù),在運(yùn)行時(shí)會(huì)自動(dòng)出現(xiàn)在執(zhí)行環(huán)境中。此外,也可以創(chuàng)建自定義的構(gòu)造函數(shù),從而定義自定義對(duì)象類型的屬性和方法。例如,可以使用構(gòu)造函數(shù)模式將前面的例子重寫(xiě)如下:
function Person(name,age,Job){
this.name=name;
this.age=age;
this.Job=Job;
this.sayName=function(){
alert(this.name);
};
}
var personl:new Person("Nicholas",29,"Software Engineer");
var person2=new Person("Greg",27,"Doctor");
personl.sayName(); //"Nicholas"
person2.sayName(); //"Greg"
在這個(gè)例子中,Person()函數(shù)取代了createPerson()函數(shù)。我們注意到,Person()中的代碼除了與createPerson()中相同的部分外,還存在以下不同之處:
□沒(méi)有顯式地創(chuàng)建對(duì)象;
□直接將屬性和方法賦給了this對(duì)象;
□沒(méi)有return語(yǔ)句。
此外,還應(yīng)該注意到函數(shù)名Person使用的是大寫(xiě)字母P,按照慣例,構(gòu)造函數(shù)始終都應(yīng)該以一個(gè)大寫(xiě)字母開(kāi)頭,而非構(gòu)造函數(shù)則應(yīng)該以一個(gè)小寫(xiě)字母開(kāi)頭。這個(gè)做法借鑒自其他OO語(yǔ)言,主要是 為了區(qū)別于ECMAScript中的其他函數(shù);因?yàn)闃?gòu)造函數(shù)本身也是函數(shù),只不過(guò)可以用來(lái)創(chuàng)建對(duì)象而已。
要?jiǎng)?chuàng)建Person的新實(shí)例,必須使用new操作符。以這種方式調(diào)用構(gòu)造函數(shù)實(shí)際上會(huì)經(jīng)歷以下4個(gè)步驟:
(1)創(chuàng)建一個(gè)新對(duì)象;
(2)將構(gòu)造函數(shù)的作用域賦給新對(duì)象(因此this就指向了這個(gè)新對(duì)象);
(3)執(zhí)行構(gòu)造函數(shù)中的代碼(為這個(gè)新對(duì)象添加屬性);
(4)返回新對(duì)象。
備注:南昌網(wǎng)站設(shè)計(jì)公司技術(shù)認(rèn)為,構(gòu)造類似于類的結(jié)構(gòu),但有些不用.
在前面例子的最后,personl和person2分別保存著Person的一個(gè)不同的實(shí)例。這兩個(gè)對(duì)象都有一個(gè)constructor(構(gòu)造函數(shù))屬性,該屬性指向Person,如下所示:
alert(personl.constructor==Person); //true
alert(person2.constructor==Person); //true
對(duì)象的constructor屬性最初是用來(lái)標(biāo)識(shí)對(duì)象類型的。但是,提到檢測(cè)對(duì)象類型,還是instanceof操作符要更可靠一些。我們?cè)谶@個(gè)例子中創(chuàng)建的所有對(duì)象既是Object的實(shí)例,同時(shí)也是Person的實(shí)例,這一點(diǎn)通過(guò)instanceof操作符可以得到驗(yàn)證:
alert(personl instanceof Object); //true
alert(personl instanceof Person); //true
alert(person2 instanceof Object); //true
alert(person2 instanceof Person); //true
創(chuàng)建自定義的構(gòu)造函數(shù)意味著將來(lái)可以將它的實(shí)例標(biāo)識(shí)為一種特定的類型;而這正是構(gòu)造函數(shù)模式勝過(guò)工廠模式的地方。在這個(gè)例子中,personl和person2之所以同時(shí)是Object的實(shí)例,是因?yàn)樗袑?duì)象均繼承自O(shè)bject。
南昌網(wǎng)絡(luò)公司技術(shù)員提示,以這種方式定義的構(gòu)造函數(shù)是定義在Global對(duì)象(在瀏覽器中是window對(duì)象)中的,因此除非另有說(shuō)明,instanceof操作符和constructor屬性始終會(huì)假設(shè)是在全局作用域中查詢構(gòu)造函數(shù).
本文僅限內(nèi)部技術(shù)人員學(xué)習(xí)交流,不得作于其他商業(yè)用途. 文章出自:南昌網(wǎng)站建設(shè)公司-百恒網(wǎng)絡(luò) http://www.gimmickmag.com 如轉(zhuǎn)載請(qǐng)注明出處!