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
問題還是沒解決嗎 ?? 這裡有更多的 Ubuntu 相關教學可以參考哩 ...
買本阿舍寫的電子書帶走 - Ubuntu 指令新手馬上會用到的 35 個技法
沒有留言 :
張貼留言