JavaScript接口


JavaScript中實現接口的方法有三種:

第一種,使用注釋的方法實現接口

特點:
(1)最簡單,但是功能最弱

(2)利用 interface和 implement"文字"
(3)把他們用注釋的方式表現出來

具體實現如下:

1,用注釋定義一個接口
 /*
    * interface PersonDao(){
    * function add(obj);
    * function remove(obj);
    * function find(id);
    * }
    * */

(2)用注釋來注明實現的接口

 /*
    * PersonDaoImp  implement PersonDao (PersonDaoImp實現接口PersonDao) 
    * */
    var PersonDaoImp=function () {   };//定義實現類
//實現 PersonDaoImp.prototype.add
=function(obj){ //具體代碼 } PersonDaoImp.prototype.remove=function(obj){ //具體代碼 } PersonDaoImp.prototype.find=function(id){ //具體代碼 }

總結:

(1)使用文字的形式告知是誰實現誰
(2)優點,這樣是很有意義的,大型項目需要的就是規范和標准,可以在沒有寫實現之前充分考慮架構和設計
(3)缺點:需要人為的遵守注釋中的說明

第二種,使用屬性檢驗法實現接口 。 實質為通過一個屬性判斷實現了誰
具體如下:

1,用注釋來定義一個接口
  /*
     * interface PersonDao(){
     * function add(obj);
     * function remove(obj);
     * function find(id);
     * }
     * */
2,用注釋來說明實現接口類+實現類中增加屬性
/*
     * PersonDaoImp  implement PersonDao
     * */
    var PersonDaoImp=function () {
        this.implementInterface=["PersonDao"];//告知該類實現的接口是啥是一個數組,
}
    PersonDaoImp.prototype.add=function(obj){
             alert(obj);
    }
    PersonDaoImp.prototype.remove=function(obj){
        //具體實現
    }
    PersonDaoImp.prototype.find=function(id){
        //具體實現
    }

(3)檢驗屬性的方法

  //接收一個不定參數 可能有多個  使用Object
        function imp1(Object) {
        //遍歷傳入對象的所用屬性  i=1:第一個是不定參數,從第二個參數開始遍歷接口,故i=1
            for(var i=1;i<arguments.length;i++){//arguments除Object外
                var interfaceName=arguments[i];
                var interfaceFind=false;
                for(var j=0;j<Object.implementInterface.length;j++){
                     if(Object.implementInterface[j]==interfaceName){
                         interfaceFind=true;
                         break;
                     }
                }
                if(!interfaceFind){
                    return false;
                }
            }
            return true;
        }

(4)接口與實現類的配合實現

  function addObj(obj) {
        var PersonDao=new PersonDaoImp();
        //開始檢查  實現類是否實現接口
            if(!imp1(PersonDao,"PersonDao")){//某對象是否實現接口(對象,接口)   第一次參數是對象,第二個參數是不定參數
                throw  new Error("PersonDaoImp沒有實現接口PersonDao");
            }else{//實現
                PersonDao.add(obj);
            }
    }

(5)使用

addObj("實現");

 總結一下,該種方式只是簡單判斷了在實現時有沒有傳遞與屬性中相同的接口名稱,而對於方法是否實現沒有做驗證。

 於是有了第三種的鴨式變形法--檢驗接口中的方法是否實現。
第三種,鴨式變形法 一種形似的命名方式,從實現角度來理解為:如果對象中具有的方法與接口中定義的方法同名  則認為是實現了本接口。
具體如下:
1,定義一個接口類 注意這里與上面兩種不一樣了,不用寫注釋說明了
var Interface=function (name,methods) {//name:接口名字
        if(arguments.length<2){
            alert("必須是兩個參數")
        }
        this.name=name;
        this.methods=[];//定義一個空數組裝載函數名
        for(var i=0;i<methods.length;i++){
            if(typeof  methods[i]!="string"){
                alert("函數名必須是字符串類型");
            }else {
                this.methods.push( methods[i]);
            }
        }
    }
 
        
2,定義一個靜態方法來實現接口與實現類的 直接檢驗
注意,
靜態方法不要寫成Interface.prototype ,因為這是寫到接口的原型鏈上的,我們要把靜態的函數直接寫到類層次上。
Interface.ensureImplement=function (object) {
     if(arguments.length<2){
         throw  new Error("參數必須不少於2個")
         return false;
     }
     for(var i=1;i<arguments.length;i++){
         var inter=arguments[i];
         //如果是接口就必須是Interface類型
         if(inter.constructor!=Interface){
                throw  new Error("如果是接口類的話,就必須是Interface類型");
         }
            //判斷接口中的方法是否全部實現
           //遍歷函數集合
          for(var j=0;j<inter.methods.length;j++){
            var method=inter.methods[j];//接口中所有函數

              //object[method]是傳入的函數
             if(!object[method]||typeof object[method]!="function" ){//實現類中必須有方法名字與接口中所用方法名相同
                     throw  new Error("實現類中沒有完全實現接口中的所有方法")
                        }
                    }
     }
 }

3,應用

3.1定義自己的接口    

         例如:此處定義兩個接口

 var FirstInterface=new Interface("FirstInterface",["add","remove","search"]);//第一個接口
 var SecondInterface=new Interface("SecondInterface",["save"]);//第二個接口

3.2,定義實現類

 function commManager() {//實現兩個類
        //先實現方法
        this.add=function () {
            alert("ok--實現");
        }
        this.remove=function () {
        }
        this.search=function () {
        }
        this.save=function () {
        }
        //檢驗
        Interface.ensureImplement(this,GridManager,formManager);
    }

3.3,實現類的實例化

var comm=new commManager();
    comm.add();//調用

 總結:三種方式都有自己的優勢與缺點,每種的選擇需要根據自己的需要進行選擇。但是在設計的時候實現類間低耦合的相當重要的。

本人初學,若有不足之處,還希望大家能多多指出,大家相互學習,謝謝。

 

 

 

 

 


 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM