2012-01-31

Prototype-based Language 有什麼不同 ?

阿舍看到很多在稱讚 Javascript 的文章都會提到說,因為 Javascript 是一種 Prototype-based 的電腦語言,所以,它會有.... 等等的好處,不過,說實在的,阿舍對於 Prototype-based Language 這種東西是一點概念都沒有,只知道說 Javascript 可以透過一個叫做 prototype 的屬性來幫上層物件新增屬性或方法而已,其它的,阿舍就沒有多花時間來瞭解了,但是,最近阿舍在看一本 Javascript 的書的時候又有提到 Prototype-based Language 這個東西,所以,阿舍就決定要來好好瞭解一下哩 !

Credit : nitrOVM

像 Java 和 C++ 這類常見的物件導向程式語言在建立物件的時候,會需要先寫出一個物件的類別(Class),然後,才利用這個類別來建立包含資料的物件,所以,物件受限於類別而無法即時新增屬性和方法 ( 註: 技術上還是可行的),而像 Javascript 這種 Prototype-based Language 就不需先有 Class 再有 Object,直接就可以定義一個包含資料的物件來用哩 !

不過,不需要定義類別並不代表 Prototype-based Language 不能夠有建構式(Constructor),阿舍一開始誤會這個不需要類別的意思,就以為 Prototype-based Language 不需要有建構式,其實,Prototype-based Language 還是可以透過建構式來初始化物件,只是,沒有「Class」這樣的保留字來建立類別和需要有類別才能有物件的。

另外,除了直接建立物件之外,Prototype-based Language 的物件繼承方式也不太一樣,像 Java 或 C++ 的繼承是在定義類別時指定要繼承的類別來當作父類別 (SuperClass),而 Prototype-based Language 的繼承則是經由指定物件的 Prototype 物件來達成的,所以,Prototype-based Language 的物件可以在建立後的任何時間,透過 Prototype 屬性來指定要繼承的物件,而且,只要被繼承的物件新增屬性或方法,繼而的物件也可以馬上使用這些新增的屬性和方法哩 !

所以,從上面提到的二項特性來看,大概就可以瞭解到,為什麼這種語言會叫做 Prototype-based Language 了,主要是因為這一類的語言所建立的每一個物件都是一個「原型」,不需要透過任何範本的方式才能建立,而且是即建即用,方法和屬性也是可以動態的新增,因此,此種語言的彈性會比需要定義類別式的語言來得大,但是,相對的,程式結構就比較不嚴謹,也比較容易發生執行時期的錯誤哩 !

最後,要說明一下,本文所主要是以 Javascript 為基礎來說明 Prototype-based Language,但是,Prototype-based Language 已經發展出許多種語言出來,不只有 Javascript,而每一種 Prototype-based Language 在實作上都會有一些些的差異的,但是,大原則是不會變的。

參考資料:
Class-based vs. prototype-based languages
Prototype-based programming (Wikipedia)
Professional: JavaScript for Web Developers
What does it mean that javascript is a prototype-based language

推薦閱讀


有疑問? 問題還是沒解決嗎? 歡迎下方留言提問和討論 😁

沒有留言 :

張貼留言

歡迎留言提問和討論 .... 😁