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

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

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

創(chuàng)建一個(gè)空對(duì)象。

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

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

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

注意:在JavaScript標(biāo)準(zhǔn)中,并沒(méi)有__prop__這個(gè)屬性,不過(guò)它現(xiàn)在已經(jīng)是一些主流的JavaScript執(zhí)行環(huán)境默認(rèn)的一個(gè)標(biāo)準(zhǔn)屬性,用于指向構(gòu)造函數(shù)的原型。該屬性是默認(rèn)不可見(jiàn)的,而且在各執(zhí)行環(huán)境中實(shí)現(xiàn)的細(xì)節(jié)不盡相同,例如IE瀏覽器中不存在該屬性。我們只要知道Javascript對(duì)象內(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);

}

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

this.getAge = function(){

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

}

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

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

}

注意:由于JS函數(shù)的閉包特性,這些私有成員,被所有在構(gòu)造函數(shù)中定義的公有方法所共享,而且僅被在構(gòu)造函數(shù)中定義的公有方法所共享。這意味著,在prototype中定義的類(lèi)成員將不能訪問(wèn)在構(gòu)造體中定義的私有成員。成員)。

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

Person.prototype.sayHello = function(){

alert('hello world!');

}

//靜態(tài)屬性

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

Person.name = 'china';

//靜態(tài)方法

Person.alertname = function(){

alert(this.name);

}

//實(shí)例化

var m1 = new Person('me');

//---- 測(cè)試屬性 ----//

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

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

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

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

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

//---- 測(cè)試方法 ----//

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

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

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

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

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

//---- 測(cè)試prototype ----//

//console.log(m1.prototype); //undefined, 實(shí)例對(duì)象沒(méi)有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(yǔ)言本身具有的機(jī)制。不應(yīng)該過(guò)多的應(yīng)用在JS的模型構(gòu)建中。公有成員的使用,更能提高我們代碼的可讀性,使我們構(gòu)建的模型更加清晰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容