js構造函數的構造函數是什么 js構造函數的八種方法



文章插圖
js構造函數的構造函數是什么 js構造函數的八種方法

文章插圖
由于JavaScript的特性,一個構造函數就可以實現類的功能,所以有的時候,我們定義一個類,往往可以直接寫一個構造函數:
function Cup(cupCover, cupBody, cupBottom) {this.cupCover = cupCoverthis.cupBody = cupBodythis.cupBottom = cupBottom}復制代碼【js構造函數的構造函數是什么 js構造函數的八種方法】這樣的定義方式很靈活簡單,但有時候實例化出錯了,也不會有相應的提示 。
比如我們這樣的實例化:
let cup = Cup('iron', 'plastic', 'rubber')復制代碼當我們沒有加上new的時候,編譯器并不會提示(弱類型的特點),而且由于Cup本身就是一個函數,所以在使用的時候,也可以正常運行 。
但是當我們cup此時肯定不是Cup類的,顯而易見,當我們把Cup當作一個函數執行的時候,cup的值取決于函數的返回 。這里沒有返回,所以是undefined 。
那么我們執行完這個Cup()函數后,造成了什么影響呢?答案是Cup的屬性綁定到了全局變量上 。對于瀏覽器來說就是window
cup.cupCover // undefinedwindow.cupCover // "iron"復制代碼所以,我們該如何避免這種情況發生呢?
我們可以稍稍改造一下Cup構造函數:
function Cup(cupCover, cupBody, cupBottom) {if(this instanceof Cup) {this.cupCover = cupCoverthis.cupBody = cupBodythis.cupBottom = cupBottom}else {return new Cup()}}復制代碼這樣當我們再次不小心執行let cup = Cup(‘iron’, ‘plastic’, ‘rubber’)時,由于此時的this并不是Cup的派生類,所以我們直接返回一個實例 。
let cup = Cup('iron', 'plastic', 'rubber')cup.cupCover // "iron"復制代碼而這種形式的構造函數,就是今天要說的安全模式的構造函數 。