JS中的安全類(lèi)、繼承與內(nèi)置構(gòu)造函數(shù)

一、安全類(lèi)
無(wú)論外部如何調(diào)用(使用new關(guān)鍵字 或 ?當(dāng)作普通函數(shù))該類(lèi),都會(huì)返回一個(gè)類(lèi)的實(shí)例化對(duì)象

二、繼承
繼承是面向?qū)ο笳Z(yǔ)言中最顯著的一個(gè)特征。
它是從已有的類(lèi)中派生出新的類(lèi),新的類(lèi)能吸收已有類(lèi)(基類(lèi)、父類(lèi))的數(shù)據(jù)(特征和行為),并拓展屬于自己的新的能力。
類(lèi):具有相同特征和行為的集合。
比如:人類(lèi)有姓名、年齡、性別、身高、體重等屬性,吃飯、睡覺(jué)、走路等等行為,所以人可以劃為一類(lèi)。
人類(lèi)這個(gè)大的范圍太廣了,我們還可以進(jìn)行細(xì)分,根據(jù)不同的劃分標(biāo)準(zhǔn)可以劃分出不同的小類(lèi):
按照膚色:黃種人 ? 白種人 ? 黑種人
按照國(guó)籍:中國(guó)人、法國(guó)人、美國(guó)人、俄羅斯等
按照工種:教師、學(xué)生、醫(yī)生、工人、農(nóng)民等等
........
在傳統(tǒng)的JS中不存在類(lèi)的概念,我們使用構(gòu)造函數(shù)模擬類(lèi),并通過(guò)一些方式實(shí)現(xiàn)類(lèi)與類(lèi)之間的繼承。
對(duì)象:從類(lèi)中拿出的具體特性和行為的個(gè)體。
比如:張三豐 ? 年齡23 ?性別男 ?黃種人 ? 國(guó)籍中華人民共和國(guó) ? 是一個(gè)醫(yī)生
類(lèi)和對(duì)象關(guān)系:
類(lèi)是對(duì)象的抽象化;
對(duì)象是類(lèi)的具體化。
傳統(tǒng)JS中提供了幾種繼承的方式:類(lèi)式繼承(原型繼承)、構(gòu)造函數(shù)式繼承(apply和call方法)、組合式繼承(前面兩種組合)、寄生式繼承(類(lèi)式繼承的優(yōu)化)、寄生組合式繼承(寄生繼承和組合繼承的結(jié)合)
2.1 類(lèi)式繼承
類(lèi)式繼承也叫原型繼承,將子類(lèi)的原型指向父類(lèi)實(shí)例化對(duì)象。


觀察上面控制臺(tái)信息,還是有一些地方需要優(yōu)化:
子類(lèi)的構(gòu)造函數(shù)指向了父類(lèi)需要優(yōu)化為指向子類(lèi)自己的構(gòu)造函數(shù)(上面代碼中解決)。
原型中有空的參數(shù)undefined需要優(yōu)化;
父類(lèi)和子類(lèi)有一些共同的參數(shù),需要優(yōu)化;
利用 apply 和 call 方法


這種方式對(duì) ? 父類(lèi)和子類(lèi)有一些共同的參數(shù),進(jìn)行了優(yōu)化;
當(dāng)調(diào)用父類(lèi)原型中的方法時(shí),報(bào)錯(cuò)。
說(shuō)明,這種方式不是真正的繼承。
但是,如果是在父類(lèi)函數(shù)中自帶的本地屬性和方法,可以直接調(diào)用。
2.3 組合式繼承
原型繼承 + ?aplly繼承


組合式繼承

這種方式解決的問(wèn)題:父子類(lèi)參數(shù)相同問(wèn)題,實(shí)現(xiàn)真正的繼承可以調(diào)用父類(lèi)原型中的方法。
依舊存在的問(wèn)題:在實(shí)例化對(duì)象的原型上,存在空的屬性。
封裝一個(gè)函數(shù),解決原型上空參數(shù)問(wèn)題。


解決的問(wèn)題:空參數(shù)
依舊存在的問(wèn)題:父子參數(shù)重復(fù)
2.5 寄生組合式繼承
這是我們建議的最終形態(tài),優(yōu)化程度較高。


寄生組合式繼承 瀏覽器操作
優(yōu)化了:空參數(shù)問(wèn)題 ?父子重復(fù)參數(shù)的問(wèn)題
2.5?ES5優(yōu)化
利用?Object.create() 方法優(yōu)化


一種是由宿主環(huán)境所提供的構(gòu)造函數(shù):宿主環(huán)境就是JS代碼執(zhí)行的環(huán)境。目前所謂的宿主環(huán)境其實(shí)是瀏覽器環(huán)境。
Image對(duì)象

另外一種就是ECMAScript核心語(yǔ)法提供的構(gòu)造函數(shù):Object ? ?Array ? String ? ?RegExp ? ?Date ? Function ?Number ? ?Boolean??


內(nèi)置構(gòu)造函數(shù)之間的關(guān)系:
JS中除了undefined之外所有的東西都可以看作是對(duì)象,函數(shù)也是對(duì)象;
所有的對(duì)象又都可以看作是構(gòu)造函數(shù)Object的實(shí)例,Object構(gòu)造函數(shù)也是函數(shù);
所有的函數(shù)又是Function的實(shí)例;

如果你感覺(jué)up寫(xiě)的還不錯(cuò),請(qǐng)?jiān)谙路近c(diǎn)個(gè)贊,就是對(duì)up的最大支持;
如果在某些知識(shí)點(diǎn)上,有什么意見(jiàn)和建議,也可以提出來(lái)進(jìn)行探討。
個(gè)人微信公眾號(hào):前端知識(shí)分享喵