工廠模式與構(gòu)造函數(shù)創(chuàng)建對象

對象

我們常聽到一句話:“在javascript中,一切皆是對象”属瓣。那么對象是什么呢组民?ECMA-262把對象定義為:“無序?qū)傩缘募习羧裕鋵傩钥梢园局担瑢ο蠡蛘吆瘮?shù)”臭胜。也就是說對象是一組沒有特定順序的值莫其,它的每個(gè)屬性或者方法都有一個(gè)名字,每個(gè)名字都映射到一個(gè)值耸三。

創(chuàng)建對象有很多種方法乱陡,最原始的方法是這樣的:

var person = {

? ? name: "wanghan",

? ? age: "20",

? ? getName: function() {

? ? ? ? console.log(this.name);

? ? }

}

console.log(person.age); //20 訪問屬性的方式一

console.log(person['age']); //20 訪問屬性的方式二

person.getName(); //wanghan

也可以這樣寫:

var person = { };

? ? person.name= "wanghan",

? ? person.age= "20",

? ? person.getName= function() {

? ? ? ? console.log(this.name);

? ? }

雖然這些方式都可以簡單的創(chuàng)建一個(gè)對象,但是它們都有明顯的弊端吕晌。假如說我們要創(chuàng)建一組相似的對象蛋褥,這些對象擁有相同的屬性名,只是屬性值各不相同睛驳,我們用上面的辦法就需要重復(fù)很多的代碼,這顯然是不合理的膜廊。還好我們有更機(jī)智的辦法乏沸。

工廠模式

對于上面創(chuàng)建多個(gè)相似對象的問題,我們可以用一個(gè)函數(shù)來封裝它所有的屬性爪瓜,這樣我們只要給函數(shù)傳入不同的參數(shù)(屬性值)蹬跃,就能輕松創(chuàng)建出一個(gè)對象。就像工廠里加工產(chǎn)品一樣,只要有一個(gè)模子蝶缀,我們就可以復(fù)制出來無數(shù)個(gè)產(chǎn)品丹喻。

function person(a,b) {

? ? var o = {}; //這個(gè)對象就相當(dāng)于模子

? ? o.name = a;

? ? o.age = b;

? ? o.getName=function () {

? ? ? ? console.log(this.name);

? ? };

? ? return o; //函數(shù)被調(diào)用時(shí)就會返回這個(gè)對象

}

var fun = person("wanghan",20);

fun.getName(); //wanghan

console.log(fun.age); //20

console.log(fun instanceof Object); //true

console.log(fun instanceof person); //false

簡單來說,使用工廠模式創(chuàng)建對象的過程就是翁都,在函數(shù)內(nèi)創(chuàng)建一個(gè)對象碍论,賦予屬性及方法后再將對象返回。但是工廠模式創(chuàng)建的實(shí)例類型全都是Object柄慰,卻不能識別到底是哪種對象類型鳍悠。instanceof 用于判斷一個(gè)變量是否是某個(gè)對象的實(shí)例,從上例最后兩行代碼就能看出坐搔,工廠模式就像暗箱操作藏研,實(shí)例不知道自己是被誰創(chuàng)造的。但是好在“構(gòu)造函數(shù)模式”可以解決這個(gè)問題概行。

構(gòu)造函數(shù)模式

我們用構(gòu)造函數(shù)重寫上面的栗子:

function Person(a,b) {

? ? this.name = a;

? ? this.age = b;

? ? this.getName = function () {

? ? ? ? console.log(this.name);

? ? };

}

var fun = new Person("wanghan",20)

fun.getName(); //wanghan

console.log(fun.age); //20

console.log(fun instanceof Object); //true

console.log(fun instanceof Person); //true

最后兩行代碼可以看出蠢挡,在這個(gè)模式中,可以驗(yàn)證fun是構(gòu)造函數(shù)Person的實(shí)例,說明了構(gòu)造函數(shù)可以將它的實(shí)例標(biāo)識為一種特定的類型凳忙,這正是勝于工廠模式的地方业踏。

我們仔細(xì)觀察構(gòu)造函數(shù)與工廠模式創(chuàng)造的函數(shù)的不同之處:

沒有顯式地創(chuàng)建對象;

直接將屬性和方法賦值給了this對象消略;

沒有return語句堡称;

函數(shù)首字母大寫(為了區(qū)別于普通函數(shù));

調(diào)用函數(shù)時(shí)用到new操作符艺演。

new操作符

構(gòu)造函數(shù)跟其他函數(shù)的唯一區(qū)別却紧,就在于調(diào)用它們的方式不同,任何函數(shù)胎撤,只要通過new操作符來調(diào)用晓殊,那它就可以作為構(gòu)造函數(shù)。通過new調(diào)用函數(shù)時(shí)會經(jīng)歷以下步驟:

創(chuàng)建一個(gè)新對象伤提;

將構(gòu)造函數(shù)的作用域賦值給了新對象(因此this就指向了這個(gè)新對象)巫俺;

執(zhí)行構(gòu)造函數(shù)中的代碼(為這個(gè)新對象添加屬性);

返回新對象

構(gòu)造函數(shù)的問題

構(gòu)造函數(shù)模式雖然好用肿男,但也并非沒有缺點(diǎn)介汹,它的主要問題就是每個(gè)方法要在每個(gè)實(shí)例上創(chuàng)建一遍。在上面的栗子中舶沛,實(shí)例fun中創(chuàng)建了一個(gè)getName方法嘹承,但是如果我們再實(shí)例化一個(gè)對象,會再次創(chuàng)建一個(gè)getName方法如庭,并且這兩個(gè)同名函數(shù)是不相等的叹卷。

? ? function Person(a,b) {

? ? ? ? this.name = a;

? ? ? ? this.age = b;

? ? ? ? this.getName = function () {

? ? ? ? ? ? console.log(this.name);

? ? ? ? };

? ? }

? ? var fun = new Person("wanghan",20);

? ? var fun2 = new Person("wanghan",20);

? ? console.log(fun.getName == fun2.getName); //false

這些getName方法實(shí)現(xiàn)的功能是完全一樣的,但是由于分別屬于不同的實(shí)例,就不得不為每個(gè)getName分配空間骤竹,這顯然是不合理的帝牡,那要怎么樣才能讓所有的實(shí)例都訪問同一個(gè)getName方法呢,這就要用到原型模式了蒙揣。關(guān)于原型靶溜,且聽下回分解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸣奔,隨后出現(xiàn)的幾起案子墨技,更是在濱河造成了極大的恐慌,老刑警劉巖挎狸,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扣汪,死亡現(xiàn)場離奇詭異,居然都是意外死亡锨匆,警方通過查閱死者的電腦和手機(jī)崭别,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恐锣,“玉大人茅主,你說我怎么就攤上這事⊥亮瘢” “怎么了诀姚?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長玷禽。 經(jīng)常有香客問我赫段,道長,這世上最難降的妖魔是什么矢赁? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任糯笙,我火速辦了婚禮,結(jié)果婚禮上撩银,老公的妹妹穿的比我還像新娘给涕。我一直安慰自己,他們只是感情好额获,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布够庙。 她就那樣靜靜地躺著,像睡著了一般抄邀。 火紅的嫁衣襯著肌膚如雪首启。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天撤摸,我揣著相機(jī)與錄音,去河邊找鬼。 笑死准夷,一個(gè)胖子當(dāng)著我的面吹牛钥飞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衫嵌,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼读宙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了楔绞?” 一聲冷哼從身側(cè)響起结闸,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酒朵,沒想到半個(gè)月后桦锄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔫耽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年结耀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匙铡。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡图甜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鳖眼,到底是詐尸還是另有隱情黑毅,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布钦讳,位于F島的核電站矿瘦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蜂厅。R本人自食惡果不足惜匪凡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掘猿。 院中可真熱鬧病游,春花似錦、人聲如沸稠通。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽改橘。三九已至滋尉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間飞主,已是汗流浹背狮惜。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工高诺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碾篡。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓虱而,卻偏偏與公主長得像,于是被迫代替她去往敵國和親开泽。 傳聞我的和親對象是個(gè)殘疾皇子牡拇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容