當(dāng)我們用一個新的表達式創(chuàng)建一個對象時,構(gòu)造函數(shù)被new以方法的形式調(diào)用:
在上面的示例代碼中,構(gòu)造函數(shù)在開頭和結(jié)尾所做的事情,新的表達式,為我們做了:
New會創(chuàng)建一個空白對象,使其原型鏈綁定構(gòu)造函數(shù)的原型屬性,使其構(gòu)造函數(shù)屬性綁定構(gòu)造函數(shù);然后用這個對象作為這個上下文調(diào)用構(gòu)造函數(shù),如果構(gòu)造函數(shù)不返回值,就把空白對象作為創(chuàng)建的對象 。用代碼寫的是:
new調(diào)用的構(gòu)造函數(shù)已經(jīng)轉(zhuǎn)化為構(gòu)造函數(shù),但為了保持其構(gòu)造函數(shù)能力,一般實現(xiàn)如下:
接下來,考慮類的繼承 。
實例對象的初始化流程是:先由超類的構(gòu)造函數(shù)初始化,再由子類的構(gòu)造函數(shù)初始化,以滿足子類覆蓋超類的要求 ?;诖?,示例代碼如下:
寫到這里,我們發(fā)現(xiàn)是一堆標(biāo)準(zhǔn)代碼不得不寫 。所以早期很多前端框架陸續(xù)提供了上述代碼的封裝方案,但是一直沒有統(tǒng)一的解決方案,直到ES6直接提供了類語法,整個事情才告一段落:
注意:JavaScript中的屬性分為存儲屬性和訪問屬性(分別對應(yīng)傳統(tǒng)OOP語言中的字段和屬性) 。只有原型中的方法和訪問屬性可以在類中聲明,但舊的方法是在原型中聲明存儲屬性 。
類表達只是語法層面的封裝,最終還是基于原型和原型鏈 。
雖然我們不 。;現(xiàn)在不需要根據(jù)那套復(fù)雜的規(guī)范來聲明類,理解原型和原型鏈,深入理解JavaScript的OOP機制仍然非常重要 。
最后給出JavaScript內(nèi)置對象之間的原型鏈圖(粗箭頭為__proto__屬性,細(xì)箭頭為原型屬性,虛箭頭為構(gòu)造器屬性):
【js二種特殊數(shù)據(jù)類型 es6如何添加symbol】(Valu:數(shù)、字符串、布爾型;符號、Contain:陣列、集合、地圖)
推薦閱讀
- C語言中各種數(shù)據(jù)類型有什么區(qū)別 c語言四種基本數(shù)據(jù)類型
- excel表格設(shè)置x和y軸的數(shù)據(jù)區(qū)域 excel數(shù)據(jù)區(qū)間怎么弄
- 何所似是什么特殊句式
- 硬盤損壞如何保證數(shù)據(jù)安全 硬盤壞了打不開電腦
- 華為手機一鍵刪除舊數(shù)據(jù)的技巧 華為云空間滿了怎么清理刪除
- 王者榮耀排位 排位規(guī)則大數(shù)據(jù)公開
- 恢復(fù)損壞的U盤中的重要數(shù)據(jù)文件步驟 u盤文件損壞且無法讀取怎么修復(fù)
- 為什么分析比較實驗數(shù)據(jù)很重要
- 手機賬號密碼忘了解決方法 vivo清除數(shù)據(jù)仍然要密碼怎么辦
- 數(shù)據(jù)遷移到新iPhone上方法 轉(zhuǎn)移到ios是轉(zhuǎn)移什么內(nèi)容
