摘:JS構(gòu)造函數(shù)new的過程酪耕。

(摘自:https://segmentfault.com/q/1010000005926088)

造函數(shù)其實和普通函數(shù)本質(zhì)上并無區(qū)別,唯一的區(qū)別有兩個:

函數(shù)首字母大寫轨淌,這個區(qū)別只是約定俗成的迂烁,便于區(qū)分。你實在要小寫定義構(gòu)造函數(shù)也完全沒問題递鹉,所以這個區(qū)別可以忽略婚被。
構(gòu)造函數(shù)的調(diào)用需要用new操作符,而普通函數(shù)的調(diào)用又分很多種梳虽,但是都不會用到new操作符址芯。所以,構(gòu)造函數(shù)和普通函數(shù)的區(qū)別就在這個new操作符里窜觉,現(xiàn)在讓我們來好好研究一下這個new操作符谷炸。
用new操作符創(chuàng)建對象時發(fā)生的事情:
第一步: 創(chuàng)建一個Object對象實例。
第二步: 將構(gòu)造函數(shù)的執(zhí)行對象賦給新生成的這個實例禀挫。
第三步: 執(zhí)行構(gòu)造函數(shù)中的代碼
第四步: 返回新生成的對象實例

注意:原本的構(gòu)造函數(shù)是window對象的方法旬陡,如果不用new操作符而直接調(diào)用,那么構(gòu)造函數(shù)的執(zhí)行對象就 是window语婴,即this指向了window描孟。現(xiàn)在用new操作符后,this就指向了新生成的對象砰左。理解這一步至關(guān)重要匿醒。
執(zhí)行構(gòu)造函數(shù)中的代碼,看代碼:

function Person(){
this.name = "Tiny Colder";
var age = 22;
window.age = 22;
}
var p = new Person();
alert(p.name)//Tiny Colder;
alert(p.age)//undefined;
alert(window.age)//22;
當(dāng)用new操作符創(chuàng)建對象時缠导,先創(chuàng)建了一個對象實例廉羔,然后執(zhí)行代碼。所以還在糾結(jié)僻造,什么時候構(gòu)造函數(shù)定義的屬性會繼承給實例對象的憋他,都可以這么來看:

   var p = new Object();
        p.name = "Tiny Colder";

這是普通的創(chuàng)建對象,然后給對象添加屬性的方法髓削。如果每創(chuàng)建一個對象竹挡,都需要這么幾行代碼,無疑是糟糕的立膛。這個需求就正好跟這一點對應(yīng):new操作符揪罕,自動執(zhí)行構(gòu)造函數(shù)里的代碼。如此我們便可以省掉添加屬性時重復(fù)冗余的代碼。那么這些屬性時如何添加到新生成的對象里的呢耸序?

第二個步驟里已經(jīng)說了:將構(gòu)造函數(shù)的執(zhí)行對象賦給新生成的這個實例忍些。再結(jié)合上一段里說的,自動執(zhí)行構(gòu)造函數(shù)里的this.name = "Tiny Colder";時坎怪,就相當(dāng)于是執(zhí)行p.name = "Tiny Colder";而構(gòu)造函數(shù)里的
var age = 22;語句罢坝,會執(zhí)行但是對新生成的對象并無影響。window.age = 22;語句搅窿,會執(zhí)行嘁酿,且會給window對象添加一個屬性。alert為證男应。

或許到這里闹司,你已經(jīng)理解了new操作符的前三步了,重要的三步沐飘。但是這個函數(shù)是如何返回對象的呢游桩?我們并沒有看到有任何跟return相關(guān)的語句。這就是new操作符的最后一步:返回新生成的對象耐朴。
如果被調(diào)用的函數(shù)沒有顯式的 return 表達(dá)式(僅限于返回對象)借卧,則隱式的會返回 this 對象 - 也就是新創(chuàng)建的對象。

現(xiàn)在來看一下這個代碼:

function Person(){
        this.name = "Tiny Colder";
        return {};
    }
    var p = new Person();
    alert(p.name)//undefined;

一個對象就這么被創(chuàng)建出來了筛峭。
實際上铐刘,

var p = new Person();

var p = new Object();
Person.apply(p);
是一樣的效果。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末影晓,一起剝皮案震驚了整個濱河市镰吵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挂签,老刑警劉巖疤祭,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異竹握,居然都是意外死亡画株,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門啦辐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜈项,你說我怎么就攤上這事芹关。” “怎么了紧卒?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵侥衬,是天一觀的道長。 經(jīng)常有香客問我,道長轴总,這世上最難降的妖魔是什么直颅? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮怀樟,結(jié)果婚禮上功偿,老公的妹妹穿的比我還像新娘。我一直安慰自己往堡,他們只是感情好械荷,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虑灰,像睡著了一般吨瞎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上穆咐,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天颤诀,我揣著相機(jī)與錄音,去河邊找鬼对湃。 笑死崖叫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的熟尉。 我是一名探鬼主播归露,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼斤儿!你這毒婦竟也來了剧包?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤往果,失蹤者是張志新(化名)和其女友劉穎疆液,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陕贮,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡堕油,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肮之。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掉缺。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖戈擒,靈堂內(nèi)的尸體忽然破棺而出眶明,到底是詐尸還是另有隱情,我是刑警寧澤筐高,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布搜囱,位于F島的核電站丑瞧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蜀肘。R本人自食惡果不足惜绊汹,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扮宠。 院中可真熱鬧西乖,春花似錦、人聲如沸涵卵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轿偎。三九已至典鸡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坏晦,已是汗流浹背萝玷。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留昆婿,地道東北人球碉。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像仓蛆,于是被迫代替她去往敵國和親睁冬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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