但是JavaScript中沒有相應的機制,但是Javascript很靈活,我們可以用它的特性去模仿Interface,但是我們需要加入一些methods來做check的動作
我們還是可以使用程式來類比JavaScript Interface介面的實現。一般來說,類比Interface的實現有如下三種方法:
1.注釋法——將介面的定義寫在注釋中,大家能否小心注意,以實現介面的所有方法全憑自覺
2.屬性檢查法——自己說明我實現了哪些介面,一會兒你檢查的時候記得檢查我說我實現的介面裡面,是否把我真正想要實現的介面全部實現了(這麼彆扭呢),總之就是自欺欺人
3.鴨式辨型法——像鴨子一樣,嘎嘎叫的那麼就是鴨子。具有鴨子特性的東西,我們就可以稱之為鴨子。能直立行走,會使用工具的除了機器人,都是人。嗯~~
按照書中介紹的,我們也一樣彩注釋法與鴨式辨型相結合的方法,來類比Js的介面實現。
| 代碼如下 |
複製代碼 |
// Constructor /* * @param name String 介面的名字 * @param methods Array 介面裡面定義的方法 */ var Interface = function(name, methods){ //如果購造函數的參數不等於2個,那麼拋出異常 if (arguments.length != 2) { throw new Error("Interface constructor called with " + arguments.length + "arguments,but expected exactyl 2.") } this.name = name; this.methods = []; //方法數組,保證傳進來的methods數組中,每一個元素都是字串類型 for (var i = 0, len = methods.length; i < len; i++) { if (typeof methods[i] !== "string") { throw new Error("Interface constructor expects methods names to bo " + "passed in asastring."); } this.methods.push(methods[i]); } } //Static class methods Interface.ensureImplements = function(object){ //如果參數少於2個,拋出異常,object是待判斷實現介面的對象 if (arguments.length < 2) { throw new Error("Function Interface.ensureImplements called with " + arguments.length + "arguments,but expected at least 2."); } for (var i = 1, len = arguments.length; i < len; i++) { //inter_face為介面,一定要實現Interface類 //書中使用interface,因是JavaScript中保留字,所以暫替換為inter_face var inter_face = arguments[i]; if (inter_face.constructor !== Interface) { throw new Error("Function Interface.ensureImplementsexpects arguments " + "two and above to be instances of Interface."); } for (var j = 0, methodsLen = inter_face.methods.length; j < methodsLen; j++) { //對象中是否含有介面中定義的方法 var method = inter_face.methods[j]; if (!object[method] || typeof object[method] !== 'function') { throw new Error("Function Interface.ensureImplements: object " + "does not implements the " + inter_face.name + "interface.Method " + method + "was not found."); } } } } |
可能大家比較暈,注釋寫在哪了?答,注釋寫在調用的頁面上。例如:
| 代碼如下 |
複製代碼 |
//定義介面Composite,實現add,remove,getChild三種方法 var Composite = new Interface('Composite',['add','remove','getChild']); //定義介面FormItem,實現save方法 var FormItem = new Interface('FormItem',['save']); //判斷對象是否實現了上述兩個介面 var object = new Class(); Interface.ensureImplements(object,Composite,FormItem); |
介面固然是好用,不過有的時候也要判斷一下是否有必要用介面。這可是一項很難的工作啊。具體情況具體分析,決定權在你。