JavaScript 安全使用構(gòu)造函數(shù)

在多個(gè)程序員開(kāi)發(fā)一個(gè)頁(yè)面的時(shí)候,作用域安全的構(gòu)造函數(shù)就很有用了,我們不能保證每個(gè)人寫(xiě)的代碼都那么小心,如果一個(gè)人代碼出錯(cuò),影響到全局屬性,那么這種錯(cuò)誤難以追蹤調(diào)試,這時(shí)候使用作用域安全的構(gòu)造函數(shù)就可以避免此類(lèi)問(wèn)題。

屬性值被掛載到window

JavaScript中構(gòu)造函數(shù)其實(shí)是一個(gè)使用new操作符調(diào)用的函數(shù),在調(diào)用時(shí), 構(gòu)造函數(shù)內(nèi)部用到的this對(duì)象會(huì)指向新創(chuàng)建的對(duì)象

function Person( name, age ){
  this.name = name;
  this.age = age;
}
var person = new Person( 'Caleb', 20 );

使用new操作符時(shí),會(huì)創(chuàng)建一個(gè)新的Person對(duì)象,并給它分配屬性。正常使用new操作符不會(huì)出現(xiàn)問(wèn)題。問(wèn)題出在疏忽忘記使用new操作符來(lái)調(diào)用構(gòu)造函數(shù)的情況下 - 由于this對(duì)象是在運(yùn)行期綁定的所以直接調(diào)用Person(),this會(huì)映射到全局對(duì)象window上,導(dǎo)致錯(cuò)誤對(duì)象屬性的意外增加。

var person = Person( 'Caleb', 20 );
alert( window.name );  //Caleb
alert( window.age );   //20

這樣原本針對(duì)Person對(duì)象的屬性被添加window對(duì)象,因?yàn)闃?gòu)造函數(shù)沒(méi)有通過(guò)new操作符調(diào)用,而是作為普通函數(shù)被調(diào)用的,由于this的晚綁定而被解析成window對(duì)象。

window的那么屬性是用來(lái)標(biāo)識(shí)鏈接目標(biāo)和框架的,這里對(duì)該屬性的偶然覆蓋可能會(huì)導(dǎo)致頁(yè)面上的其它錯(cuò)誤,這個(gè)問(wèn)題的解決方法就是創(chuàng)建一個(gè)作用域安全的構(gòu)造函數(shù)


作用域安全的構(gòu)造函數(shù)

作用域安全的構(gòu)造函數(shù)在進(jìn)行屬性賦值之前會(huì)this對(duì)象是否是正確類(lèi)型的實(shí)例,如果不是那么創(chuàng)建新的實(shí)例并返回,改造一下上面的構(gòu)造函數(shù)。

function Person( name, age ){
  if(this instanceof Person){
    this.name = name;
    this.age = age;
  }else{
    return new Person( name, age );
  }
}
var person = Person( 'Caleb', 20 );
alert( window.name );  //""
alert( person.name );  //Caleb

這段代碼中構(gòu)造函數(shù)添加了一個(gè)檢查,確保this對(duì)象是Person的實(shí)例,如果不是則使用new操作符調(diào)用,如果是則在實(shí)例內(nèi)添加屬性。

這樣保證了無(wú)論是否顯示使用new操作符,都可以正確構(gòu)造對(duì)象。貌似完美了,但是仍舊有問(wèn)題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 第5章 引用類(lèi)型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類(lèi)型 使用基本類(lèi)型...
    大學(xué)一百閱讀 3,270評(píng)論 0 4
  • 普通創(chuàng)建對(duì)象和字面量創(chuàng)建對(duì)象不足之處:雖然 Object 構(gòu)造函數(shù)或?qū)ο笞置媪慷伎梢杂脕?lái)創(chuàng)建單個(gè)對(duì)象,但這些方式有...
    believedream閱讀 2,429評(píng)論 2 18
  • 2017年10月14號(hào) 農(nóng)歷八月二十五 此刻是上午9點(diǎn)57分 四路公交行駛到四百 我坐在一位大媽的旁邊 車(chē)上后邊有...
    daee3df6c4e8閱讀 237評(píng)論 0 0
  • 馬丁·布伯的《我與你》講到世界的本質(zhì)是關(guān)系,關(guān)系分二種:我與你、我與它。 我與它:當(dāng)我將你視為我達(dá)成目標(biāo)的工具或?qū)?..
    眼睛歪了閱讀 223評(píng)論 0 0
  • 世界上總有那么一部分人,篤定地相信著愛(ài)情是細(xì)水長(zhǎng)流,是漫長(zhǎng)人生里的柴米油鹽,是那份無(wú)論何時(shí)都觸手可及的陪伴。我和這...
    Sai佐為閱讀 277評(píng)論 0 0