亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JavaScript面向對象中接口實現方法詳解

2024-05-06 16:53:33
字體:
來源:轉載
供稿:網友

本文實例講述了JavaScript面向對象中接口實現方法。分享給大家供大家參考,具體如下:

接口是面向對象編程的基礎,它是一組包含了函數型方法的數據結構,與類一樣,都是編程語言中比較抽象的概念。比如生活中的接口,機頂盒,人們利用它來實現收看不同頻道和信號的節目,它猶如對不同類型的信息進行集合和封裝的設備,最后把各種不同類型的信息轉換為電視能夠識別的信息。在編程語言中的接口,實際上是不同類的封裝并提供統一的外部聯系通道,這樣其他對象就可以利用接口來調用不同類的成員了。

——整理自《jQuery開發從入門到精通》

接口的概念

構造函數(類)是具體的實現,接口是類的約定。API接口(應用程序接口)、人機交互接口、電源接口、USB接口等雖然用途不同,功能各異,但是都包含一個共同的特性:約定、規范??梢哉f,接口就是一張契約和合同,它約定了設計者和使用者都必須遵循的要求。

接口承諾了具體類應該事先的功能。

舉一個很有必要的例子,在java中實現接口,比如下面的代碼:

interface Base{ void function1(); void function2(); void function3();}

Base接口承諾了3個基本功能:function1()、function2()、function3()。這個接口就像是一份合同,在甲方(調用類的用戶)和乙方(定義類的開發人員)之間約定。

乙方負責實現接口約定的功能。功能的實現就是所謂的類。如下實例:

class App implements Base  // 定義一個App類,用這個類來實現接口Base

類App將遵照接口的約定。專業來說就是,應用類App繼承Base接口類。

它的具體實現如下:

class App implements Base{ void function1(){  System.out.println("I am fun1"); } void function2(){  System.out.println("I am fun2"); } void function3(){  System.out.println("I am fun3"); }}

這樣,乙方實現了這個接口,而甲方也應該來按照接口的約定去使用類App就行了。

所以說,接口(interface)和類(class),實際上都是相同的數據結構。

在接口中可以聲明屬性,方法,事件,類型,但不能聲明變量,且不能設置被聲明成員的具體值(功能實現)。

也就是說,接口只能定義成員,不能給定義的成員賦值。而接口作為它的繼承類或派生類的約定,繼承類或派生類共同完成接口屬性、方法、事件、類型的實現。在接口和實現類之間,不管是方法名還是屬性調用順序上都應保持一致。

接口的目的就是約束編碼,促使代碼規范,對于強類型語言是必須的,也是非常重要的環節。但是對于JavaScript弱類型語言來說,嚴格的類型檢查會束縛JavaScript的靈活性。很多前端開發人員根本不用接口,但不會影響腳本的設計。

使用接口的好處:降低對象間的耦合度,提高代碼的靈活性。學會使用接口,能夠讓手中的函數變得靈巧,這在大型開發中是很重要的。

對于JavaScript來說,本身不支持接口功能,沒有提供內置方法。但是人工設計一個額外的接口程序,又會對程序的性能產生影響。項目越大,這種開銷越大。所以,用不用接口可以遵循兩個條件:

① 項目大小,如果是一個框架,使用接口在一定程度上會提高程序的性能。如果是簡單的應用,就不必使用接口了。

② 如果對JavaScript接口比較熟練,多用接口也可以,如果擔心過多使用接口影響性能,則可以在考慮產品發布前,清除接口功能模塊,或者設置接口的執行條件。防止它被頻繁執行,影響性能。

接口的實現

JavaScript中并不支持接口,但是我們可以模仿其他語言,來定義接口。

下面來規劃接口結構的設計和檢測功能的實現:

(1) 設計一個接口輔助的類結構,這個構造函數相當于一個過濾器,用于在接口實例化過程中,檢測初始化參數是否合法。如果符合接口設計標準,則把第2個參數中每個方法名和參數個數以數組元素的形式輸入接口內部屬性methods。在輸入前分別檢測每個參數類型是否符合規定。同時檢查參數是否存在殘缺,并即時以0補齊參數。

function Interface(name,methods){ // 接口輔助類,參數包括接口實例的名稱和方法集 if(arguments.length!=2){ // 如果參數個數不等于2,拋出異常。  throw new Error('標準接口約定,需要兩個參數'); } this.name = name; // 存儲第一個參數值,實例化后就是接口實例的名稱 this.methods = []; // 接口實例的方法存儲器 if(methods.length < 1){ // 如果第二個參數的元素個數為0,說明是空數組,拋出異常。  throw new Error('接口的第二個參數不能為空'); } for(var i = 0; i < methods.length; i++){ // 開始對第2個參數的元素進行遍歷檢測  var item = methods[i];  if(typeof item[0] !== 'string') { // 如果第二個參數的第一個元素不是string類型,拋出異常   throw new Error("接口約定的第一個參數應為字符串");  }  if(item[1]&&typeof item[1] !== 'number'){ // 如果第二個參數有第二個元素,且第二個元素不是number類型,拋出異常   throw new Error('接口約定的第個參數應為數值');  }  if(item.length == 1){ // 如果第二個參數只有一個元素,那么手動給它添加第二個元素 0   item[1] = 0;  }  this.methods.push(item); // 把符合規定的方法存儲到數組存儲器中。 }}

(2) 為接口輔助類 Interface 定義一個方法 implements,該方法將檢測實現類是否符合接口實例的約定。它至少包含兩個參數,第1個參數o表示實現類,第2個參數及其后面的參數表示該類將要實現的接口標準。也就是說,可以為一個類指定多個接口約定,這樣就可以更靈活的分類設計接口實例。然后遍歷第二個及其后面的所有參數,在循環結構中,先潔廁接口是否為接口標準的實例,否則就會拋出異常。再從接口實例的方法存儲器中逐一讀取方法名,填入類中來驗證類的方法是否符合接口實例設置的標準,驗證包括方法名、function類型和參數個數。如果有問題,立即拋出異常。

Interface.implements = function(o){ // 用于檢測類方法是否符合接口實例的約定 ,此處的o,將來會是類中的this if(arguments.length<2){ // 檢測該方法傳遞的數值是否符合規定  throw new Error("接口約定類應包含至少兩個參數。"); } for(var i=1;i<arguments.length; i++){ // 遍歷檢測類所遵循的實例是否合法  var interface = arguments[i]; // 這里interface表示接口的實例對象。  if(interface.constructor !== Interface){   throw new Error('從第2個以上的參數必須為接口實例');  }  for(var j=0;j<interface.methods.length;j++){ // 檢測類方法是否符合接口實例的約定   var method = interface.methods[j][0];   if(!o[method] || typeof o[method] !== 'function' || o[method].length!==interface.methods[j][1]) {    throw new Error("該實現類沒能履行" + interface.name + "接口方法" + method + "約定");   }  } }}

(3) 實例化接口標準,Interface 接口僅僅是個構造函數,也就是個框架協議,還沒有制定類應該遵循的具體標準。框架協議中,已經設計好了監測邏輯,一旦實例化接口,并指明類應遵守的約定,那么應用該標準的實例的類就必須準守。下面根據Interface接口標準定義了6個具體的接口實例。

// 設置接口的不同實現實例var Get = new Interface("Get",[["get",0]]);var Set = new Interface("Set",[["set",1]]);var Saying = new Interface("Saying",[["saying",1]]);var Base = new Interface("Base",[["get",0],["set",1]]);var Base1 = new Interface("Base1",[["set",1],["get",0]]);var Base2 = new Interface("Base2",[["get",0],["set",1],["saying",1]]);

(4) 在類中定義應該實現的標準,即類應該遵循的接口約定。

// 創建一個木驢類function Neddy(){ this.name = ''; Interface.implements(this,Base,Get,Set); // 讓木驢類實現接口的實例,可以指定多個,也可以只有一個。}// 按照接口實例來定義 兩個方法get,setNeddy.prototype.get = function(){ return this.name;}Neddy.prototype.set = function(name){ this.name = name;}

(5) 在類中設置了多個接口實例,我們來進行檢測

// 檢測接口實現var neddy = new Neddy();neddy.set("Testing");console.log(neddy.get()); // Testing

成功完成接口的應用,這里,如果在Neddy類中,我們讓它實現的接口實例和 Neddy.prototype中給類定義的方法不統一,或者接口與接口之間有沖突,就會拋出異常。比如我們可以修改Neddy中的接口實現,再給它添加一個接口實例Base2,就會報異常,因為我們沒有按照接口的協議,給Neddy添加saying()方法。

上面的舉例只是用js來模擬實現接口功能,在實際開發中,我們需要根據不同的需求,開發不同的接口。

擴展知識 :

檢測函數的參數列表一般有三種形式

  • ① arguments.callee.length
  • ② 函數名.length
  • ③ arguments.length

其中 ① 和 ② 是一樣的,③ 視具體情況而定。
一般函數聲明式的定義有個默認屬性name繼承自Object ,舉例如下:

function fn(x,y){  console.log(fn.name); // fn  console.log(arguments.callee.name); // fn  console.log(fn.length); // 2  console.log(arguments.callee.length); // 2  console.log(arguments.length); // 視具體情況而定}fn(1,2,3); // 分別輸出 fn fn 2 2 3

為了說明上面接口檢測參數長度 o[method].length  的問題 ,舉例如下:

function A(){}A.prototype.say = function (x,y,z,o) {}var a = new A();console.log(a['say'].length); // 4

希望本文所述對大家JavaScript程序設計有所幫助。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩在线一区| 精品国产一区二区三区久久狼黑人| 久久久亚洲成人| 欧美日韩激情小视频| 成人黄色av网| 亚洲毛茸茸少妇高潮呻吟| 亚洲色图狂野欧美| 色先锋久久影院av| 国产一区二区免费| 欧美成人一区在线| 亚洲一区二区三区四区在线播放| 91国产视频在线| 欧美成人午夜影院| 精品色蜜蜜精品视频在线观看| 欧美理论在线观看| 亚洲伊人第一页| 日韩电影免费观看在线| 亚洲欧美精品伊人久久| 日韩国产欧美区| 亚洲成人精品av| 欧美丰满老妇厨房牲生活| 538国产精品视频一区二区| 日本精品一区二区三区在线播放视频| 欧美视频裸体精品| 亚洲精品国产拍免费91在线| 日本成人免费在线| 亚洲自拍偷拍区| 国产在线视频不卡| 亚洲国产精品电影| 国产精品观看在线亚洲人成网| 亚洲国产高清自拍| 亚洲国产精品电影在线观看| 日韩久久免费视频| 亚洲欧美日韩在线高清直播| 日韩在线欧美在线国产在线| 久久人人爽亚洲精品天堂| 亚洲国产精品久久久久秋霞不卡| 欧美日韩免费看| 欧美成人精品一区二区| 国产精品流白浆视频| 日本久久久a级免费| 日本成人精品在线| 97av在线播放| 成人h视频在线观看播放| 国产精品自拍偷拍| 国产精品久久久久久久天堂| 成人精品在线观看| 亚洲丝袜在线视频| 色噜噜久久综合伊人一本| 日韩av在线资源| 国产一区二区三区在线播放免费观看| 日韩欧美一区二区在线| 综合136福利视频在线| 中文字幕9999| 国产精品香蕉av| 久久精品99国产精品酒店日本| 青青草精品毛片| 欧美日韩日本国产| 92版电视剧仙鹤神针在线观看| 亚洲欧美精品一区二区| 青草成人免费视频| 国产亚洲欧洲高清一区| 亚洲午夜久久久久久久| 国产精品美女网站| 久久韩国免费视频| 97婷婷涩涩精品一区| 国模精品一区二区三区色天香| 国产午夜精品一区理论片飘花| 欧美日韩亚洲精品内裤| 欧美激情精品久久久久久大尺度| 国产99视频在线观看| 欧洲亚洲免费在线| 亚洲欧美国产精品专区久久| 国产精品第1页| 国产精品久久久久久婷婷天堂| 久久久国产精品亚洲一区| 91在线观看免费高清| 亚洲成人网久久久| 日韩一区二区精品视频| 亚洲网站在线观看| 456国产精品| 亚洲人成免费电影| 亚洲香蕉伊综合在人在线视看| 国产精品美女视频网站| 黑人巨大精品欧美一区免费视频| 欧美成aaa人片免费看| 欧美激情一区二区久久久| 亚洲国产精品久久精品怡红院| 久久久精品在线观看| 在线观看视频亚洲| 久久久久久久国产精品| 国产美女扒开尿口久久久| 国产精品视频播放| 亚洲午夜精品久久久久久久久久久久| 一区二区三区回区在观看免费视频| 亚洲精品国产拍免费91在线| 乱亲女秽乱长久久久| 日韩av在线免播放器| 久久久精品欧美| 久久久久国产视频| 亚洲欧美日韩一区在线| 亚洲色图狂野欧美| 国产精自产拍久久久久久| 久久国产精品免费视频| 91九色综合久久| 欧美在线激情网| 97免费视频在线播放| 国产91免费看片| 欧美激情精品久久久久久黑人| 国产精品福利在线| 欧美激情一区二区三级高清视频| 欧美日韩国产色| 日韩小视频网址| 国产亚洲欧洲高清| 欧美极品在线视频| 久久久免费av| 在线看福利67194| 欧美日韩国产综合视频在线观看中文| 91精品中国老女人| 亚洲尤物视频网| 97人人爽人人喊人人模波多| 亚洲黄一区二区| 精品久久久久久久久中文字幕| 中文字幕国产日韩| 久久国产精品久久久久久久久久| 久久99精品国产99久久6尤物| 亚洲理论片在线观看| 97国产在线观看| 红桃视频成人在线观看| 欧美多人爱爱视频网站| 另类图片亚洲另类| 日韩欧美一区二区三区久久| 亚洲激情中文字幕| 亚洲精品福利在线观看| 亚洲成**性毛茸茸| 欧洲美女7788成人免费视频| 亚洲午夜久久久久久久| 亚洲天堂av在线免费观看| 久久久av免费| 亚洲欧美日韩国产中文| 中文.日本.精品| 欧美激情亚洲视频| 日韩av电影在线免费播放| 国产一区香蕉久久| 亚洲欧美日韩另类| 激情久久av一区av二区av三区| 国产欧美韩国高清| 亚洲欧美另类国产| 91大神在线播放精品| 欧美精品成人在线| 久久综合久中文字幕青草| 欧美日本国产在线| 欧美日韩高清在线观看| 国产三级精品网站| 久久久久中文字幕2018| 亚洲精品视频在线观看视频| 成人久久18免费网站图片| 亚洲国产成人91精品| 国产精品流白浆视频| 日韩电影免费观看在线| 亚洲欧洲免费视频| 亚洲精品一区二区三区不| 欧美精品videos另类日本| 亚洲成色777777在线观看影院|