我對(duì)工廠和構(gòu)造函數(shù)方式創(chuàng)建對(duì)象的理解

為什么要使用工廠模式和構(gòu)造函數(shù)方式創(chuàng)建對(duì)象?

雖然Object構(gòu)造函數(shù)(var obj = new Object();)或者字面量(var person={})可以創(chuàng)建單個(gè)對(duì)象肩祥,但是贮尖,他有一個(gè)明顯的缺點(diǎn)磁浇,那就是:重復(fù)造輪子,產(chǎn)生大量的重復(fù)性代碼窥摄,為了解決這個(gè)問(wèn)題,我們就開(kāi)始使用工廠模式和構(gòu)造函數(shù)模式。

什么是工廠模式 它有什么優(yōu)缺點(diǎn)?

顧名思義畦娄,工廠模式就是像工廠一樣來(lái)創(chuàng)建對(duì)象谐算。但這樣的解釋似乎有點(diǎn)欠妥熟尉,高大上一點(diǎn),工廠模式其實(shí)是軟件領(lǐng)域中一種廣為人知的一種設(shè)計(jì)模式洲脂,這種模式抽象了創(chuàng)建具體對(duì)象的過(guò)程斤儿。開(kāi)發(fā)人員發(fā)明了一種函數(shù),用函數(shù)來(lái)大量創(chuàng)建對(duì)象的方法恐锦;

下面是工廠模式創(chuàng)建對(duì)象的方法:

<pre>
<script>
function creatPerson(name,age,sex){
// var person = {};
// person.name = name;
// person.age = age;
// person.sex = sex;
// return person;
return{
name:name,
age:age,
sex:sex
}
}
var person1 = creatPerson("李四",18,"男")
var person2 = creatPerson("李四z",28,"男")
var person3 = creatPerson("李四zzz",30,"男")
console.log(person1);
console.log(person2);
console.log(person3);
</script>
</pre>

雖然工廠模式可以創(chuàng)建多個(gè)相似的對(duì)象往果,但是卻沒(méi)有解決對(duì)象的識(shí)別問(wèn)題(不知道這個(gè)對(duì)象的類(lèi)型)。

什么是構(gòu)造函數(shù)模式一铅,它和工廠模式比較有哪些好處陕贮?它自身又有那些缺點(diǎn)?

1.實(shí)例如下:

<pre>
<script>
function Person(name,age){
this.name = name;
this.age = age;

}

var p = new Person("張三","10s歲");
var p2 = new Person("李四","16歲");

console.log(p);     
console.log(p2);
// console.log(p instanceof Object);

</script>
</pre>

這個(gè)例子中潘飘,Person()函數(shù)取代了person()函數(shù)肮之;睜大你的眼睛,構(gòu)造函數(shù)創(chuàng)建對(duì)象的函數(shù)名Person()明顯是開(kāi)頭大寫(xiě)卜录,這是構(gòu)造函數(shù)的慣例戈擒,為了區(qū)分和普通函數(shù)的區(qū)別,因?yàn)闃?gòu)造函數(shù)也是函數(shù)艰毒,只不過(guò)可以創(chuàng)建對(duì)象而已筐高。

要?jiǎng)?chuàng)建Person()的新實(shí)例,必須使用new现喳,即和使用var person1 = new Person()差不多凯傲,實(shí)際上會(huì)經(jīng)歷一些步驟:

  1. 創(chuàng)建一個(gè)新的對(duì)象;
  2. 將構(gòu)造函數(shù)作用域賦給新的對(duì)象(即this指向新對(duì)象)嗦篱;
  3. 執(zhí)行構(gòu)造函數(shù)里面的代碼冰单;
  4. 返回新的對(duì)象。
構(gòu)造函數(shù)和普通函數(shù)的區(qū)別在哪灸促?

1.構(gòu)造函數(shù)和普通函數(shù)唯一的區(qū)別是他們的調(diào)用方式不同诫欠。
2.任何函數(shù)只要通過(guò)new來(lái)調(diào)用涵卵,那它就可以作為構(gòu)造函數(shù),而任何函數(shù)荒叼,如果不通過(guò)new操作符來(lái)調(diào)用轿偎,他就是普通的函數(shù)。

實(shí)例如下:

<pre>
//當(dāng)做構(gòu)造函數(shù)來(lái)使用
var person1 = new CreatePerson('張三',18,'男');
person1.sex(); //'男'

//構(gòu)造函數(shù)當(dāng)做普通函數(shù)使用
CreatePerson('張三',18,'男')
window.sex();//'男'
</pre>

構(gòu)造函數(shù)有哪些不足之處?

我們可以參照上面的構(gòu)造函數(shù)的第一個(gè)實(shí)例被廓,可以得出這種方式創(chuàng)建函數(shù)實(shí)例創(chuàng)建的對(duì)象都包含一個(gè)不同的Function實(shí)例坏晦,所以,不同實(shí)例上的同名函數(shù)是不相等的嫁乘,證明如下:

<pre>console.log(person1.sex == person2.sex);//false</pre>

2.因此以上的寫(xiě)法可以這樣簡(jiǎn)化:

<pre>function CreatePerson(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
function sexes(){
console.log(this.sex);
}
var person1 = new CreatePerson('張三',18,'男');
var person2 = new CreatePerson('李四',18,'男')</pre>

這個(gè)時(shí)候的person1.sex和person2.sex就是相等的.

我們把函數(shù)放在構(gòu)造函數(shù)的外面作為全局函數(shù)昆婿,因此person1和person2對(duì)象就共享了在全局作用域中定義的同一個(gè)sexes函數(shù)。但是問(wèn)題又來(lái)了:在全局作用域中定義的函數(shù)實(shí)際上只能被某個(gè)對(duì)象調(diào)用蜓斧,這讓該全局作用域有點(diǎn)名不副實(shí)仓蛆。更讓然無(wú)法接受的是:如果對(duì)象需要定義很多方法,那么就要定義很多個(gè)全局函數(shù)挎春,那么我們這個(gè)自定義的引用類(lèi)型就絲毫沒(méi)有封裝性可言了看疙。因此我們需要另一種高大上的模式,——原型模式(prototype)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末直奋,一起剝皮案震驚了整個(gè)濱河市能庆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帮碰,老刑警劉巖相味,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異殉挽,居然都是意外死亡丰涉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)斯碌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)一死,“玉大人,你說(shuō)我怎么就攤上這事傻唾⊥洞龋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵冠骄,是天一觀的道長(zhǎng)伪煤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)凛辣,這世上最難降的妖魔是什么抱既? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮扁誓,結(jié)果婚禮上防泵,老公的妹妹穿的比我還像新娘蚀之。我一直安慰自己,他們只是感情好捷泞,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布足删。 她就那樣靜靜地躺著,像睡著了一般锁右。 火紅的嫁衣襯著肌膚如雪失受。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天咏瑟,我揣著相機(jī)與錄音贱纠,去河邊找鬼。 笑死响蕴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惠桃。 我是一名探鬼主播浦夷,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辜王!你這毒婦竟也來(lái)了劈狐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤呐馆,失蹤者是張志新(化名)和其女友劉穎肥缔,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體汹来,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡续膳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了收班。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坟岔。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖摔桦,靈堂內(nèi)的尸體忽然破棺而出社付,到底是詐尸還是另有隱情,我是刑警寧澤邻耕,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布鸥咖,位于F島的核電站,受9級(jí)特大地震影響兄世,放射性物質(zhì)發(fā)生泄漏啼辣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一碘饼、第九天 我趴在偏房一處隱蔽的房頂上張望熙兔。 院中可真熱鬧悲伶,春花似錦、人聲如沸住涉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舆声。三九已至花沉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間媳握,已是汗流浹背碱屁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛾找,地道東北人娩脾。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像打毛,于是被迫代替她去往敵國(guó)和親柿赊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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