重新認(rèn)識面向?qū)ο?br>
為了說明 JavaScript 是一門徹底的面向?qū)ο蟮恼Z言导梆,首先有必要從面向?qū)ο蟮母拍钪?, 探討一下面向?qū)ο笾械膸讉€(gè)概念:
一切事物皆對象
對象具有封裝和繼承特性
對象與對象之間使用消息通信,各自存在信息隱藏
實(shí)際上碑隆,JavaScript 語言是通過一種叫做原型(prototype)的方式來實(shí)現(xiàn)面向?qū)ο缶幊痰摹O旅婢蛠碛懻?b>基于類的(class-based)面向?qū)ο?/b>和基于原型的 (prototype-based) 面向?qū)ο?/b>這兩種方式在構(gòu)造客觀世界的方式上的差別蹬音。
使用函數(shù)構(gòu)造器構(gòu)造對象
除了字面式聲明(literal notation)方式之外上煤,ECMAScript 允許通過構(gòu)造器(constructor)創(chuàng)建對象。每個(gè)構(gòu)造器實(shí)際上是一個(gè)函數(shù)(function) 對象, 該函數(shù)對象含有一個(gè)“prototype”屬性用于實(shí)現(xiàn)基于原型的繼承(prototype-based inheritance)和共享屬性(shared properties)著淆。對象可以由“new 關(guān)鍵字 + 構(gòu)造器調(diào)用”的方式來創(chuàng)建
徹底理解原型鏈 (prototype chain)
在 ECMAScript 中劫狠,每個(gè)由構(gòu)造器創(chuàng)建的對象擁有一個(gè)指向構(gòu)造器 prototype 屬性值的隱式引用(implicit reference),這個(gè)引用稱之為原型(prototype)牧抽。進(jìn)一步嘉熊,每個(gè)原型可以擁有指向自己原型的隱式引用(即該原型的原型),如此下去扬舒,這就是所謂的原型鏈(prototype chain)在具體的語言實(shí)現(xiàn)中阐肤,每個(gè)對象都有一個(gè)__proto__ 屬性來實(shí)現(xiàn)對原型的隱式引用
基于類的面向?qū)ο蠛突谠偷拿嫦驅(qū)ο蠓绞奖容^
在基于類的面向?qū)ο蠓绞街校?b>對象(object)依靠類(class)來產(chǎn)生。而在基于原型的面向?qū)ο蠓绞街校?b>對象(object)則是依靠構(gòu)造器(constructor)利用原型(prototype)構(gòu)造出來的。舉個(gè)客觀世界的例子來說明二種方式認(rèn)知的差異孕惜。例如工廠造一輛車愧薛,一方面,工人必須參照一張工程圖紙衫画,設(shè)計(jì)規(guī)定這輛車應(yīng)該如何制造毫炉。這里的工程圖紙就好比是語言中的類 (class),而車就是按照這個(gè)類(class)制造出來的削罩;另一方面瞄勾,工人和機(jī)器 ( 相當(dāng)于 constructor) 利用各種零部件如發(fā)動(dòng)機(jī),輪胎弥激,方向盤 ( 相當(dāng)于 prototype 的各個(gè)屬性 ) 將汽車構(gòu)造出來进陡。