JavaScript接口的實(shí)現(xiàn)

什么是接口

接口是面向?qū)ο蟮膉avascript 很有用的工具之一敏沉,接口提供了一種用以說明一個(gè)對象應(yīng)該具有哪些方法手段,它可以表明這些方法的 語義,但它不規(guī)定這些方法應(yīng)該如何實(shí)現(xiàn) 就像 汽車都可以在 路上跑, 但 人們并不管他是 如何實(shí)現(xiàn)的。
但是在javascript中并沒有內(nèi)置的接口,所以我們要自己實(shí)現(xiàn)。在javascript中大致有三種實(shí)現(xiàn)接口的方法。
現(xiàn)在我們來說第一種

注釋描述法

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

上述通過注釋的方式描述了兩個(gè)接口疟暖。

var CompositeForm = function(id,method,action){ 
            
        }
        CompositeForm.prototype.add = function(child){
            
        };
        CompositeForm.prototype.remove = function(child){
            
        };
        CompositeForm.prototype.getChild = function(index){
            
        };
        CompositeForm.prototype.save = function(){
            
        };

CompositeForm實(shí)現(xiàn)了上面兩個(gè)接口,我們看到它實(shí)現(xiàn)了兩個(gè)接口的全部方法,并沒有遺漏俐巴,單如果開發(fā)者忘記實(shí)現(xiàn)某一方也不會(huì)有任何的報(bào)錯(cuò)骨望。所以這種方法雖然簡單,但是在實(shí)際開發(fā)中卻并不適用欣舵。

屬性檢查模仿接口

var CompositeForm = function(id,method,action){
            //implements Composite 和 FormItem 兩個(gè)接口
            this.implementsInterfaces = ['Composite','FormItem'];
            //檢查 是否實(shí)現(xiàn)
            implementsCheck(this,'Composite','FormItem');
            // addForm(this);
        }
function implementsCheck (object){
            for(var i=1;i<arguments.length;i++){
                var interfaceName = arguments[i];
                var interfaceFound = false;
                for(var j=0;i<=object.implementsInterfaces.length;j++){
                    if(object.implementsInterfaces[j] == interfaceName){
                        interfaceFound = true;
                        break;
                    }
                }
                if(!interfaceFound){
                    return false;
                }
            }
            return true;
        }

CompositeForm說自己實(shí)現(xiàn)了Composite,FormItem連個(gè)接口擎鸠,它把這兩個(gè)接口放到數(shù)組implementsInterfaces中,顯示自己支持什么接口缘圈,在implementsCheck中檢查劣光,但是這樣還有問題。
你只知道它說自己實(shí)現(xiàn)了這兩個(gè)接口糟把,單并不是到它是否 完全實(shí)現(xiàn)這兩個(gè)接口的所有方法绢涡。

鴨式辨型模仿接口

其實(shí)類是否聲明自己支持哪些接口并不重要,它只要實(shí)現(xiàn)了接口的方法就行糊饱。

var Interface = function(name,methods){
            if(arguments.length!=2){
                throw new Error('2個(gè)參數(shù)需要');
            }
            this.name = name;
            this.methods = [];
            for(var i=0;i<methods.length;i++){
                if(typeof methods[i] !== 'string'){
                    throw new Error('方法名稱應(yīng)該是字符串');
                }
                this.methods.push(methods[i]);
            }
        }
Interface.ensureImplements = function(object){
            if(arguments.length<2){
                throw new Error('arguments at lest 2');
            }
            for(var i =1; i< arguments.length;i++){
                var interfacetmp = arguments[i];
                if(interfacetmp.constructor !== Interface){
                    throw new Error('not Interface');
                }
                for(j=0;j<interfacetmp.methods.length;j++){
                    var method = interfacetmp.methods[j];
                    if(!object[method] || typeof object[method] != 'function'){
                        throw new Error(method+'沒有實(shí)現(xiàn)接口方法');
                    }
                }
            }
        }
var ResultSet = new Interface('ResultSet',['getDate','getResults']);
        
        var resultObject = function(){
                //檢查實(shí)現(xiàn)情況
               Interface.ensureImplements(this,ResultSet);
        }
        resultObject.prototype.getDate = function(){};
        resultObject.prototype.getResults = function(){};
        var resultFormatter = function(resultObject){
            Interface.ensureImplements(resultObject,ResultSet);
            
        }
        var test = new resultObject();
        resultFormatter(resultObject.prototype);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垂寥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子另锋,更是在濱河造成了極大的恐慌滞项,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夭坪,死亡現(xiàn)場離奇詭異文判,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)室梅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門戏仓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人亡鼠,你說我怎么就攤上這事赏殃。” “怎么了间涵?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵仁热,是天一觀的道長。 經(jīng)常有香客問我勾哩,道長抗蠢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任思劳,我火速辦了婚禮迅矛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘潜叛。我一直安慰自己秽褒,他們只是感情好壶硅,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著震嫉,像睡著了一般森瘪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上票堵,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音逮栅,去河邊找鬼悴势。 笑死,一個(gè)胖子當(dāng)著我的面吹牛措伐,可吹牛的內(nèi)容都是我干的特纤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼侥加,長吁一口氣:“原來是場噩夢啊……” “哼捧存!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起担败,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤昔穴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后提前,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吗货,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年狈网,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宙搬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拓哺,死狀恐怖勇垛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情士鸥,我是刑警寧澤闲孤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站础淤,受9級特大地震影響崭放,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸽凶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一币砂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玻侥,春花似錦决摧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽边锁。三九已至,卻和暖如春波岛,著一層夾襖步出監(jiān)牢的瞬間茅坛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工则拷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贡蓖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓煌茬,卻偏偏與公主長得像斥铺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子坛善,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容