Javascript構(gòu)造函數(shù)簡析

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

根據(jù)調(diào)研锈锤,在使用new操作符通過構(gòu)造函數(shù)實(shí)例化一個(gè)對象時(shí),經(jīng)過了以下過程:

創(chuàng)建一個(gè)空對象闲询。

將這個(gè)空對象的__proto__成員指向了構(gòu)造函數(shù)對象的prototype成員對象久免。

將構(gòu)造函數(shù)的作用域賦給新對象,因此構(gòu)造函數(shù)中的this指向新對象扭弧,然后再在該對象上下文中調(diào)用構(gòu)造函數(shù)阎姥。

返回新創(chuàng)建對象。

注意:在JavaScript標(biāo)準(zhǔn)中鸽捻,并沒有__prop__這個(gè)屬性丁寄,不過它現(xiàn)在已經(jīng)是一些主流的JavaScript執(zhí)行環(huán)境默認(rèn)的一個(gè)標(biāo)準(zhǔn)屬性氨淌,用于指向構(gòu)造函數(shù)的原型。該屬性是默認(rèn)不可見的伊磺,而且在各執(zhí)行環(huán)境中實(shí)現(xiàn)的細(xì)節(jié)不盡相同,例如IE瀏覽器中不存在該屬性删咱。我們只要知道Javascript對象內(nèi)部存在指向構(gòu)造函數(shù)原型的指針就可以了屑埋,這個(gè)指針是在調(diào)用new表達(dá)式的時(shí)候自動(dòng)賦值的,并且我們不應(yīng)該去修改它痰滋。

function Person(msg){

//特權(quán)屬性(公有屬性)

this.myMsg = msg; //只在被實(shí)例化后的實(shí)例中可調(diào)用

this.address = '大連';

//私有屬性

var name = 'Sumer';

var age = 21;

var that = this;

//私有方法

function getName(){

alert(that.name);

}

//公有方法摘能,能被外部公開訪問,這個(gè)方法每次實(shí)例化都要重新構(gòu)造而prototype是原型共享敲街,所有實(shí)例化后团搞,都共同引用同一個(gè)

this.getAge = function(){

alert(age); //在公有方法中可以訪問私有成員

}

//私有和公有成員在函數(shù)的內(nèi)部,在構(gòu)造函數(shù)創(chuàng)建的每個(gè)實(shí)例中都會包含同樣的私有和公有成員的副本多艇,因而實(shí)例越多占用的內(nèi)存越多

//而且私有成員僅僅是在對象創(chuàng)建時(shí)逻恐,由構(gòu)造函數(shù)在對象上下文下運(yùn)行,不具有該對象的直接引用峻黍。

}

注意:由于JS函數(shù)的閉包特性复隆,這些私有成員,被所有在構(gòu)造函數(shù)中定義的公有方法所共享姆涩,而且僅被在構(gòu)造函數(shù)中定義的公有方法所共享挽拂。這意味著,在prototype中定義的類成員將不能訪問在構(gòu)造體中定義的私有成員骨饿。成員)亏栈。

//公有方法,適用于通過new關(guān)鍵字實(shí)例化的該對象的每個(gè)實(shí)例宏赘,向prototype中添加成員將會把新方法添加到構(gòu)造函數(shù)的底層中去

Person.prototype.sayHello = function(){

alert('hello world!');

}

//靜態(tài)屬性

//適用于對象的特殊實(shí)例绒北,就是作為Function對象實(shí)例的構(gòu)造函數(shù)本身

Person.name = 'china';

//靜態(tài)方法

Person.alertname = function(){

alert(this.name);

}

//實(shí)例化

var m1 = new Person('me');

//---- 測試屬性 ----//

//console.log(Person.name); //china

//console.log(m1.name); //undefined, 靜態(tài)屬性不適用于一般實(shí)例

//console.log(m1.constructor.name); //china, 想訪問類的靜態(tài)屬性,先訪問該實(shí)例的構(gòu)造函數(shù)置鼻,然后在訪問該類靜態(tài)屬性

//console.log(Person.address); //undefined,Person中的this指的不是函數(shù)本身镇饮,而是調(diào)用address的對象,而且只能是對象

//console.log(m1.address); //大連 此時(shí)this指的是實(shí)例化后的m1

//---- 測試方法 ----//

//Person.alertname(); //china,直接調(diào)用函數(shù)的類方法

//m1.alertname(); //FF: m1.alertname is not a function, alertname 是Person類的方法箕母,和實(shí)例對象沒有直接關(guān)系

//m1.constructor.alertname(); //china, 調(diào)用該對象構(gòu)造函數(shù)(類函數(shù))的方法(函數(shù))

//m1.sayHello(); //hello everyone, myObject類的prototype原型下的方法將會被實(shí)例繼承

//Person.sayHello(); //Person.sayHello is not a function储藐,sayHello是原型方法,不是類的方法

//---- 測試prototype ----//

//console.log(m1.prototype); //undefined, 實(shí)例對象沒有prototype

//console.log(Person.prototype); //Object

//alert(Person.prototype.constructor); //console.log返回Person(msg)嘶是,此時(shí)alert()更清楚钙勃,相當(dāng)于Person

//console.log(Person.prototype.constructor.name); //china, 相當(dāng)于Person.name;

由此分析可以清楚的了解到,使用私有成員聂喇,是以犧牲代碼可讀性為代價(jià)的辖源。而且這種實(shí)現(xiàn)更多的是一種JavaScript技巧蔚携,因?yàn)樗⒉皇钦Z言本身具有的機(jī)制。不應(yīng)該過多的應(yīng)用在JS的模型構(gòu)建中克饶。公有成員的使用酝蜒,更能提高我們代碼的可讀性,使我們構(gòu)建的模型更加清晰矾湃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亡脑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子邀跃,更是在濱河造成了極大的恐慌霉咨,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拍屑,死亡現(xiàn)場離奇詭異途戒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)僵驰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門喷斋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矢渊,你說我怎么就攤上這事继准。” “怎么了矮男?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵移必,是天一觀的道長。 經(jīng)常有香客問我毡鉴,道長崔泵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任猪瞬,我火速辦了婚禮憎瘸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陈瘦。我一直安慰自己幌甘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布痊项。 她就那樣靜靜地躺著锅风,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鞍泉。 梳的紋絲不亂的頭發(fā)上皱埠,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機(jī)與錄音咖驮,去河邊找鬼边器。 笑死训枢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忘巧。 我是一名探鬼主播恒界,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袋坑!你這毒婦竟也來了仗处?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤枣宫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后吃环,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體也颤,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年郁轻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翅娶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡好唯,死狀恐怖竭沫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骑篙,我是刑警寧澤蜕提,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站靶端,受9級特大地震影響谎势,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杨名,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一脏榆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧台谍,春花似錦须喂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至介衔,卻和暖如春恨胚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炎咖。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工赃泡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寒波,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓升熊,卻偏偏與公主長得像俄烁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子级野,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評論 2 361

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

  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品页屠,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式蓖柔。簡單...
    舟漁行舟閱讀 7,777評論 2 17
  • 普通創(chuàng)建對象和字面量創(chuàng)建對象不足之處:雖然 Object 構(gòu)造函數(shù)或?qū)ο笞置媪慷伎梢杂脕韯?chuàng)建單個(gè)對象辰企,但這些方式有...
    believedream閱讀 2,384評論 2 18
  • @轉(zhuǎn)自GitHub 介紹js的基本數(shù)據(jù)類型。Undefined况鸣、Null牢贸、Boolean、Number镐捧、Strin...
    YT_Zou閱讀 1,163評論 0 0
  • 那一季的風(fēng)盤旋在 河口很久 河邊的綠柳 互致愛意點(diǎn)著頭 被風(fēng)撩撥的河面 漾起陣陣清波 調(diào)皮的小魚 露出白肚皮在水面...
    一杯老酒閱讀 540評論 25 12
  • 還有74天面臨高考潜索,可熱情卻一天天減退,受不了這樣頹廢的自己懂酱,卻也無法擺脫竹习。目標(biāo)或許在,又或許不在列牺,因?yàn)橹挥衅趟?..
    memorybye閱讀 198評論 0 0