Javascript中構(gòu)造函數(shù)要注意的一些坑
前言
最近在家看書(shū):《你不知道的Javascript》,看到構(gòu)造函數(shù)調(diào)用時(shí)會(huì)綁定this,就順便打開(kāi)控制臺(tái)輸了一些代碼,詳細(xì)測(cè)試了一下。
構(gòu)造函數(shù)簡(jiǎn)單的講,即定義出來(lái)專(zhuān)供new 式調(diào)用的函數(shù)。
如:
function A(b) {
this.b = b || 'bbb';
}
然后你就可以通過(guò)new ,來(lái)構(gòu)建一個(gè) A 的實(shí)例:
var a = new A('B')
但是,一個(gè)首要的坑是,構(gòu)造函數(shù)與一個(gè)普通函數(shù)并無(wú)不同,如果你故意不使用new,或忘記用new,都會(huì)得到奇怪的錯(cuò)誤:
var aa = A('adadada');
這樣調(diào)用,并不會(huì)顯式地報(bào)錯(cuò),但實(shí)際上隱患深埋:
- aa并不是A的實(shí)例,而變成了 undefined
- 多了一個(gè)名為 b 的全局變量,值是 ‘a(chǎn)dadada'
這就是無(wú)new 調(diào)用構(gòu)造函數(shù)的坑。
下面說(shuō)其他的:
構(gòu)造函數(shù)自身有返回值
比如:
function A(b) {
this.b = b || 'bbb';
return {b: '0000'};
}
這個(gè)時(shí)候,無(wú)論是否使用new來(lái)調(diào)用A,得到的結(jié)果都會(huì)相同,即得到一個(gè)普通對(duì)象:{b:'0000′}
當(dāng)然,此時(shí)是否帶 new 調(diào)用,還是有一個(gè)不同點(diǎn)的,即:不帶new時(shí),依然會(huì)莫名聲明一個(gè) 叫 b 的全局變量。
既然,構(gòu)造函數(shù)有顯式返回值時(shí),會(huì)代替默認(rèn)應(yīng)該返回的this,成為返回值,那么,是不是所有返回值都能覆蓋this呢?
測(cè)試顯式返回值
眾所周知,函數(shù)都是有返回值的,只是如果沒(méi)有 return,則會(huì)返回undefined.
那么,我就在構(gòu)造函數(shù)里顯式返回一個(gè)undefined,會(huì)怎么樣?
var a = function (){this.b = 'b'; return undefined};
new a(); // {b:'b'}
顯式返回一個(gè) undefined ,并不能阻止構(gòu)造函數(shù)式調(diào)用的默認(rèn)行為。
下圖是更多測(cè)試:

簡(jiǎn)單的總結(jié):
顯式的返回以下值:undefined, null, boolean, number等基礎(chǔ)類(lèi)型,并不會(huì)代替 new 式調(diào)用的默認(rèn)行為。
但顯式返回以下值:{},[],RegExp, Date, Function,均會(huì)代替 new 調(diào)用的默認(rèn)返回值 this.
大家都看到了,后者,全都是 對(duì)象,是復(fù)雜類(lèi)型。
隨手一記
前面說(shuō)過(guò),本該進(jìn)行 new 式調(diào)用的構(gòu)造函數(shù),被當(dāng)作普通函數(shù)調(diào)用,那么,如果函數(shù)體中,有 this.x = xxx 這樣的賦值語(yǔ)句,則會(huì)被賦值給全局對(duì)象(即 windows),從而變成一個(gè)全局變量。
原因相信大家都知道,而本書(shū)中也專(zhuān)門(mén)講過(guò):函數(shù)調(diào)用時(shí),默認(rèn)的this就是綁定至全局對(duì)象。
而本書(shū)還提到:如果函數(shù)體是嚴(yán)格模式,則不會(huì)綁定 this 至全局對(duì)象,如:
var a = function (){'use strict';this.b = 'b'; return /111/g};
a(); // 直接報(bào)錯(cuò)
因?yàn)閲?yán)格模式下,默認(rèn)的 this 指向 undefined
所以說(shuō),有兩點(diǎn)要提一下:
- 嚴(yán)格模式真不錯(cuò)
- 如果你想聲明一個(gè)構(gòu)造函數(shù),那么嚴(yán)格模式是非常必要的
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
- JavaScript字符串轉(zhuǎn)數(shù)字的5種方法及遇到的坑
- 使用PHP json_decode可能遇到的坑與解決方法
- 基于js粘貼事件paste簡(jiǎn)單解析以及遇到的坑
- JavaScript代碼編寫(xiě)中各種各樣的坑和填坑方法
- JavaScript中使用typeof運(yùn)算符需要注意的幾個(gè)坑
- JS大坑之19位數(shù)的Number型精度丟失問(wèn)題詳解
- JS面試題大坑之隱式類(lèi)型轉(zhuǎn)換實(shí)例代碼
- 對(duì)象題目的一個(gè)坑 理解Javascript對(duì)象
- 弱類(lèi)型語(yǔ)言javascript開(kāi)發(fā)中的一些坑實(shí)例小結(jié)【變量、函數(shù)、數(shù)組、對(duì)象、作用域等】
相關(guān)文章
three.js 實(shí)現(xiàn)露珠滴落動(dòng)畫(huà)效果的示例代碼
這篇文章主要介紹了three.js 實(shí)現(xiàn)露珠滴落動(dòng)畫(huà)效果的示例代碼,非常不錯(cuò),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
js限制checkbox選中個(gè)數(shù)以限制六個(gè)為例
需要展示多個(gè)checkbox復(fù)選框,而只能允許最多選6個(gè),下面為大家介紹下如何使用js限制checkbox選中個(gè)數(shù),需要的朋友可以參考下2014-07-07
JavaScript高級(jí)程序設(shè)計(jì) 讀書(shū)筆記之八 Function類(lèi)及閉包
Function類(lèi)及閉包,學(xué)習(xí)js的朋友可以參考下2012-02-02
實(shí)用的js 焦點(diǎn)圖切換效果 結(jié)構(gòu)行為相分離
行為層是由js來(lái)實(shí)現(xiàn)的,這里的工作只是搭建了一個(gè)簡(jiǎn)單的骨架,如果要讓效果圖美觀些并符合設(shè)計(jì)要求,就要發(fā)揮css的強(qiáng)大作用了。2010-06-06
解決layui調(diào)用自定義方法提示未定義的問(wèn)題
今天小編就為大家分享一篇解決layui調(diào)用自定義方法提示未定義的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09

