構(gòu)造函數(shù)模式
2023-02-14?
圍觀熱度 1223?技術(shù)推薦
ECMAScript中的構(gòu)造函數(shù)是用于創(chuàng)建特定類(lèi)型對(duì)象的。像Object和Array這樣的原生構(gòu)造函數(shù),運(yùn)行時(shí)可以直接在執(zhí)行環(huán)境中使用。當(dāng)然也可以自定義構(gòu)造函數(shù),以函數(shù)的形式為自己的對(duì)象類(lèi)型定義屬性和方法。
Person()構(gòu)造函數(shù)代替了createPerson()工廠函數(shù)。實(shí)際上,Person()內(nèi)部的代碼跟createPerson()基本是一樣的,只是有如下區(qū)別。
? 沒(méi)有顯式地創(chuàng)建對(duì)象。
? 屬性和方法直接賦值給了this。
? 沒(méi)有return。
另外,要注意函數(shù)名Person的首字母大寫(xiě)了。按照慣例,構(gòu)造函數(shù)名稱的首字母都是要大寫(xiě)的,非構(gòu)造函數(shù)則以小寫(xiě)字母開(kāi)頭。這是從面向?qū)ο缶幊陶Z(yǔ)言那里借鑒的,有助于在ECMAScript中區(qū)分構(gòu)造函數(shù)和普通函數(shù)。畢竟ECMAScript的構(gòu)造函數(shù)就是能創(chuàng)建對(duì)象的函數(shù)。
要?jiǎng)?chuàng)建Person的實(shí)例,應(yīng)使用new操作符。以這種方式調(diào)用構(gòu)造函數(shù)會(huì)執(zhí)行如下操
(1)在內(nèi)存中創(chuàng)建一個(gè)新對(duì)象。
(2)這個(gè)新對(duì)象內(nèi)部的[[Prototype]]特性被賦值為構(gòu)造函數(shù)的prototype屬性。
(3)構(gòu)造函數(shù)內(nèi)部的this被賦值為這個(gè)新對(duì)象(即this指向新對(duì)象)。
(4)執(zhí)行構(gòu)造函數(shù)內(nèi)部的代碼(給新對(duì)象添加屬性)。
(5)如果構(gòu)造函數(shù)返回非空對(duì)象,則返回該對(duì)象;否則,返回剛創(chuàng)建的新對(duì)象。
constructor本來(lái)是用于標(biāo)識(shí)對(duì)象類(lèi)型的。不過(guò),一般認(rèn)為instanceof操作符是確定對(duì)象類(lèi)型更可靠的方式。定義自定義構(gòu)造函數(shù)可以確保實(shí)例被標(biāo)識(shí)為特定類(lèi)型,相比于工廠模式,這是一個(gè)很大的好處。構(gòu)造函數(shù)不一定要寫(xiě)成函數(shù)聲明的形式。賦值給變量的函數(shù)表達(dá)式也可以表示構(gòu)造函數(shù)。
1.構(gòu)造函數(shù)也是函數(shù)構(gòu)造
函數(shù)與普通函數(shù)唯一的區(qū)別就是調(diào)用方式不同。除此之外,構(gòu)造函數(shù)也是函數(shù)。并沒(méi)有把某個(gè)函數(shù)定義為構(gòu)造函數(shù)的特殊語(yǔ)法。任何函數(shù)只要使用new操作符調(diào)用就是構(gòu)造函數(shù),而不使用new操作符調(diào)用的函數(shù)就是普通函數(shù)。
2.構(gòu)造函數(shù)的問(wèn)題
構(gòu)造函數(shù)雖然有用,但也不是沒(méi)有問(wèn)題。構(gòu)造函數(shù)的主要問(wèn)題在于,其定義的方法會(huì)在每個(gè)實(shí)例上都創(chuàng)建一遍。因此對(duì)前面的例子而言,person1和person2都有名為sayName()的方法,但這兩個(gè)方法不是同一個(gè)Function實(shí)例。我們知道,ECMAScript中的函數(shù)是對(duì)象,因此每次定義函數(shù)時(shí),都會(huì)初始化一個(gè)對(duì)象。