由於JavaScript的特性,一個構造函數就可以實現類的功能,所以有的時候,我們定義一個類,往往可以直接寫一個構造函數:
function Cup(cupCover, cupBody, cupBottom) {
this.cupCover = cupCover
this.cupBody = cupBody
this.cupBottom = cupBottom
}
複製代碼這樣的定義方式很靈活簡單,但有時候實例化出錯了,也不會有相應的提示。
比如我們這樣的實例化:
let cup = Cup('iron', 'plastic', 'rubber')
複製代碼當我們沒有加上new的時候,編譯器並不會提示(弱類型的特點),而且由於Cup本身就是一個函數,所以在使用的時候,也可以正常運行。
但是當我們cup此時肯定不是Cup類的,顯而易見,當我們把Cup當作一個函數執行的時候,cup的值取決於函數的返回。這裡沒有返回,所以是undefined。
那麼我們執行完這個Cup()函數後,造成了什麼影響呢?答案是Cup的屬性綁定到了全局變量上。對於瀏覽器來說就是window
cup.cupCover // undefined
window.cupCover // "iron"
複製代碼所以,我們該如何避免這種情況發生呢?
我們可以稍稍改造一下Cup構造函數:
function Cup(cupCover, cupBody, cupBottom) {
if(this instanceof Cup) {
this.cupCover = cupCover
this.cupBody = cupBody
this.cupBottom = cupBottom
}
else {
return new Cup()
}
}
複製代碼這樣當我們再次不小心執行let cup = Cup(‘iron’, ‘plastic’, ‘rubber’)時,由於此時的this並不是Cup的派生類,所以我們直接返回一個實例。
let cup = Cup('iron', 'plastic', 'rubber')
cup.cupCover // "iron"
複製代碼而這種形式的構造函數,就是今天要說的安全模式的構造函數。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/221634.html
微信掃一掃
支付寶掃一掃