Javascript語(yǔ)言是符合面向?qū)ο笏枷氲摹R话銇?lái)說(shuō),面向?qū)ο笏枷胄枰獫M足以下三個(gè)基本要求:
封裝,Javascript的對(duì)象可以自由的擴(kuò)充成員變量和方法,自然是滿足該要求的
繼承,Javascript采用了比較少見(jiàn)的原型繼承機(jī)制,也滿足該要求
多態(tài),Javascript的原型繼承機(jī)制也可以支持多態(tài)
這里的關(guān)鍵問(wèn)題就是Javascript的原型繼承機(jī)制到底是個(gè)啥玩意?
1.對(duì)象的原型
有很大的可能性,Javascript在設(shè)計(jì)之初根本就沒(méi)有考慮那么復(fù)雜。啥玩意面向?qū)ο笏枷耄矣邪朊X(qián)關(guān)系啊。公司就給我兩周時(shí)間,連設(shè)計(jì)帶編碼,我當(dāng)然是怎么簡(jiǎn)單怎么來(lái)了。如果說(shuō)一門(mén)計(jì)算機(jī)語(yǔ)言一定要滿足唯一的一個(gè)最最基本的設(shè)計(jì)思想,那一定不是面向?qū)ο?,而?yīng)該是更簡(jiǎn)單的:語(yǔ)言應(yīng)支持功能的復(fù)用。如果一個(gè)對(duì)象功能不夠用了,那就再叫個(gè)幫手唄,于是Javascript硬性規(guī)定:任何對(duì)象都必須有一個(gè)原型對(duì)象。這下好了,所有的Javascript對(duì)象都是自帶秘書(shū)的,自己搞不定的就交給秘書(shū)去搞,秘書(shū)再搞不定的,就交給秘書(shū)的秘書(shū)去搞,這樣一路交接過(guò)去,直到徹底搞不定了,那就只好報(bào)錯(cuò)。這就是Javascript中的原型鏈檢索機(jī)制,是不是超簡(jiǎn)單?
因?yàn)閷?duì)象的原型是Javascript對(duì)象的基本構(gòu)件,那么首要的問(wèn)題就是如何得到對(duì)象的原型對(duì)象?大體來(lái)說(shuō)有以下兩種方法:
obj.__proto__,有點(diǎn)黑客的意思,但是現(xiàn)代幾乎所有的瀏覽器都支持它,關(guān)鍵是最直接
Object.getPrototypeOf(obj),盡管是Javascript語(yǔ)言的一個(gè)規(guī)定,但是寫(xiě)起來(lái)實(shí)在是有些費(fèi)勁