站長資訊網
        最全最豐富的資訊網站

        javascript中接口是什么

        在javascript中,接口是指對協定進行定義的引用類型,接口其實就是告訴我們一個類實現了哪些方法,從而幫助其使用這個類;接口可以讓代碼變得更穩定。

        javascript中接口是什么

        本教程操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

        JavaScript中沒有內置的創建或實現接口的方法。它也沒有內置的方法用于判斷該一個對象是否實現了與另一個對象相同的一套方法。這使對象很難互換使用。但是JavaScript很靈活,我們可以通過別的方式去實現。

        什么是接口

        接口其實就是定義了對象內應該有哪些方法。他不用去考慮這些方法是怎么去實現的,而是定義該對象有這些方法。

        接口是指對協定進行定義的引用類型。其他類型實現接口,以保證它們支持某些操作。接口指定必須由類提供的成員或實現它的其他接口。與類相似,接口可以包含方法、屬性、索引器和事件作為成員。

        接口的好處

        接口其實就是告訴我們一個類實現了哪些方法。從而幫助其使用這個類。接口可以讓我們的代碼變得更穩定,如果我們給接口添加了一個方法。而某個實現它的類沒有相應的添加這個方法,那肯定會拋出一個錯誤。

        javascript模仿接口

        JavaScript模仿接口有三種方法:

        • 注釋法

        • 屬性檢查法

        • 鴨式變型法

        用注釋描述接口

        用注釋描述接口是最簡單的方法,但是效果是最差的。

        /* interface Composite {     function add(child);     function remove(child);     function getChild(index); }  interface FormItem {     function save(); } */  class CompositeForm {     add(child) {         //...     }     remove(child) {      }     getChild(index) {         //...     }     save() {         //...     } }

        這種模仿方法不是很好,它沒有檢查CompositeForm是否正確的實現了方法,完全是通過程序員們自覺去實現注釋中的接口。不過這種實現方式非常的簡單,但是它對測試和調試沒有任何幫助。

        屬性檢查法模仿接口

        這個方法會更謹慎一點,但是接口也是注釋的形式寫出來,只是可以通過檢查一個屬性得知某個類自稱實現了什么接口。

        class CompositeForm {     constructor() {         this.implementsInterface = ['Composite', 'FormItem'];     } }  function addForm(formInstance) {     if (!implements(formInstance, 'Composite', 'FormItem')) {         throw new Error('對象沒有實現接口方法');     } }  function implements(obj) { // 這個方法查詢接口     for (let i = 1; i < arguments.length; i++) {         let interfaceName = arguments[i];         let interfaceFound = false;         for (let j = 1; j < obj.implementsInterface.length; j++) {             if (obj.implementsInterface[j] == interfaceName) {                 interfaceFound = true;                 break;             }         }         if (!interfaceFound) {             return false;         }         return true;     } }  addForm(new CompositeForm());

        這種方法的優點是他對類所實現的接口提供了文檔說明,如果需要的接口不在我這個類宣稱支持的接口之列(也就是說不在我的this.implementsInterface里),你就會看到錯誤信息。

        缺點也顯而易見,如果我的this.implementsInterface里宣稱的和我注釋里所定義的接口不一樣但檢查還是能通過的,就是調用addForm方法是不會爆破錯的

        用鴨式變型法模擬接口

        其實,類是否聲明自己支持哪些接口并不重要,只要具有這些接口中的方法就行。鴨式變型法把對象的方法集作為判斷它是不是某個實例的唯一標準。實現原理也非常的簡單:如果對象具有與接口定義的方法同名的方法,那么就可以認為他實現了這個接口。

        // interface class Interface {     constructor(name, method) {         if (arguments.length != 2) {             throw new Error('兩個參數:name method');         }         this.name = name;         this.method = [];         for (let i in method) {             if (typeof method[i] != 'string') {                 throw new Error('method 必須是字符串');             }             this.method.push(method[i]);         }     }     //檢查接口方法     static ensureImplements(obj) {         if (arguments.length < 2) {             throw new Error('參數小于兩個');         }          for (let i = 1; i < arguments.length; i++) {             var instanceInterface = arguments[i];             if (instanceInterface.constructor !== Interface) {                 throw new Error('你要檢查的參數不屬于Interface接口')             }              for (let j in instanceInterface.method) {                 let methodName = instanceInterface.method[j];                 if (!obj[methodName] || typeof obj[methodName] !== 'function') {                     throw new Error(`請實現接口的${methodName}方法`)                 }             }         }     } }  // 實例化接口對象 var Composite = new Interface('Composite', ['add', 'remove', 'getChild']); var FormItem = new Interface('FormItem', ['save']);  // CompositeForm  類 class CompositeForm {     //...     add() {}     remove() {}     getChild() {} }  let c1 = new CompositeForm(); Interface.ensureImplements(c1, Composite, FormItem);  function addForm(formInterface) {     ensureImplements(formInterface, Composite, FormItem); }

        上面代碼中的CompositeForm類中我沒有實現save方法。運行這段代碼就會報錯。

        但是鴨式變型法也是有缺點的,各個檢查方面都是強制實施的。

        本菜鳥實現方法 > 我自稱繼承法

        我用了類的繼承來模擬接口,具體實現請看代碼。

        首先我們定義一個用作接口的類,屬性method代表接口的方法集

        class Interface {     constructor() {         this.mehods = ['add', 'save', 'remove', 'save'];     }     static ensureImplements(obj) {         //...     } }

        定義一個CompositeForm類繼承這個接口,并且在該類里面調用父類的ensureImplements方法檢測接口

        class CompositeForm  extends Interface{     constructor() {         super().ensureImplements(this);     } }

        完善ensureImplements方法

        class Interface {     constructor() {         this.mehods = ['add', 'save', 'remove', 'save'];     }     static ensureImplements(obj) {         for (let i in this.mehods) {             let methodName = this.mehods[i]             if (!obj[methodName] || typeof obj[methodName] !== 'function') {                 let err = '請實現接口' + methodName + '的方法';                 throw new Error(err);             }         }     } }

        【推薦學習:javascript高級教程】

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 北条麻妃国产九九九精品视频| 欧美成人精品网站播放 | 91大神精品全国在线观看| 中文字幕精品亚洲无线码一区应用| 国产精品久久久久久久午夜片| 91精品在线看| 精品久久久久久无码专区不卡| 中文字幕乱码中文乱码51精品 | 一本大道无码日韩精品影视| 国产在线国偷精品免费看| 亚洲第一精品在线视频| 国产a∨精品一区二区三区不卡| 亚洲精品无码高潮喷水在线| 香蕉99久久国产综合精品宅男自 | 国产精品久久久久久久久鸭| 精品无码国产污污污免费网站| 真实国产精品vr专区| 无码精品第一页| 欧美精品成人3d在线| 久久精品国产亚洲av瑜伽| 国产精品美女网站在线观看| 91自慰精品亚洲| 88国产精品欧美一区二区三区| 国产精品久久国产精麻豆99网站| 成人精品视频99在线观看免费| 国产精品特级毛片一区二区三区 | 欧美国产精品久久高清| 久久亚洲国产成人精品无码区| 国产精品亚洲高清一区二区| 国产精品小视频免费无限app | 欧美国产成人精品一区二区三区 | 国产亚洲精品影视在线产品| 精品无码一级毛片免费视频观看| 国产欧美日韩综合精品二区| 国产精品久久久久一区二区三区| 国产精品女同一区二区久久| 国产精品免费在线播放| 精品欧美小视频在线观看| 精品一区二区三区免费视频| 精品国产呦系列在线观看免费| 精品人妻V?出轨中文字幕|