我在試探不同程式語言的中介編程與反射能力系列文章的第三篇PHP的中介編程與反射能力示範中提到 JavaScript 也可以透過 prototype 的操作實現直接擴充類別定義的能力,這種能力在 Ruby 中稱為 open class。本文是為了示範 JavaScript 此能力所做的補充。
本文的範例源碼係延續自JavaScript的中介編程與反射能力示範,除了加上 JavaScript 操作 prototype 擴充類別定義的程式碼外,順便也修改了原本的程式結構,令它可以直接透過建構子所接受的 Hash Table 內容,決定實體的可用資料欄位。不像前一版本顯著列出欄位清單。
我一開始想讓 d1, d2 向各位說聲 hello ,可惜我忘了加上去,所以系統補抓錯誤後告訴我它們不會說話。Ok, 那我就直接擴充它們的原型 (即 Data.prototype) ,加上說 hello 的能力。現在它們兩個都會說 hello 了。
我再替 d2 加上跳躍的能力,但不替 d1 加上這能力。最後再叫它們兩個跳一次,一如我所預期,只有 d2 跳起來。
這個版本和 PHP的中介編程與反射能力示範 的最後實作範例一樣,都不再明列類別可用的欄位內容,改為允許動態數量的欄位。每個資料個體都可以擁有不同的資料欄位,但我們不必定義更多的類別。
如果我們想為 Data 類別增加更多的行為能力,我們既不需要用到繼承,也不需要回到原始定義處修改。我們需要做的就只是打開 Data.prototype ,直接加上我們想要的行為。毫不拖泥帶水。
相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/10683081.html