您好,登錄后才能下訂單哦!
小編這次要給大家分享的是怎么實現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();//調用
看完這篇關于怎么實現JavaScript接口的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。