欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript設計模式 接口介紹

 更新時間:2012年07月24日 00:52:22   作者:  
最近在看javascript設計模式的書籍《pro javascript design pattrens》,覺得很不錯,可以提高自己對js oo的理解,也可能幫助自己更好的理解別人寫的js library,提高自己js的水平
這本書中第一個重要的內(nèi)容就是接口。

大家對接口應該都不陌生,簡單的說接口就是一個契約或者規(guī)范。在強類型的面相對象語言中,接口可以很容易的實現(xiàn)。但是在javascript中并沒有原生的創(chuàng)建或者實現(xiàn)接口的方式,或者判定一個類型是否實現(xiàn)了某個接口,我們只能利用js的靈活性的特點,模擬接口。
在javascript中實現(xiàn)接口有三種方式:注釋描述、屬性驗證、鴨子模型。
note:因為我看的是英文書,翻譯水平有限,不知道有些詞匯如何翻譯,大家只能領(lǐng)會精神了。
1. 注釋描述 (Describing Interfaces with Comments)
例子:
復制代碼 代碼如下:

/*
interface Composite {
  function add(child);
  function remove(child);
  function getChild(index);
}
interface FormItem {
  function save();
}
*/
var CompositeForm = function(id, method, action) { // implements Composite, FormItem
  ...
};
//Implement the Composite interface.
CompositeForm.prototype.add = function(child) {
...
};
CompositeForm.prototype.remove = function(child) {
...
};
CompositeForm.prototype.getChild = function(index) {
...
};
// Implement the FormItem interface.
CompositeForm.prototype.save = function() {
...
};

模擬其他面向?qū)ο笳Z言,使用interface 和 implements關(guān)鍵字,但是需要將他們注釋起來,這樣就不會有語法錯誤。
這樣做的目的,只是為了告訴其他編程人員,這些類需要實現(xiàn)什么方法,需要在編程的時候加以注意。但是沒有提供一種驗證方式,這些類是否正確實現(xiàn)了這些接口中的方法,這種方式就是一種文檔化的作法。
2. 屬性驗證(Emulating Interfaces with Attribute Checking)
例子:
復制代碼 代碼如下:

/* interface
Composite {
function add(child);
function remove(child);
function getChild(index);
}
interface FormItem {
function save();
}
*/
var CompositeForm = function(id, method, action) {
this.implementsInterfaces = ['Composite', 'FormItem'];
...
};
...
function addForm(formInstance) {
if(!implements(formInstance, 'Composite', 'FormItem')) {
    throw new Error("Object does not implement a required interface.");
  }
  ...
}
// The implements function, which checks to see if an object declares that it
// implements the required interfaces.
function implements(object) {
  for(var i = 1; i < arguments.length; i++) {
    // Looping through all arguments
    // after the first one.
    var interfaceName = arguments[i];
    var interfaceFound = false;
    for(var j = 0; j < object.implementsInterfaces.length; j++) {
      if(object.implementsInterfaces[j] == interfaceName) {
        interfaceFound = true;
        break;
      }
    }
    if(!interfaceFound) {
      return false;
      // An interface was not found.
   }
  }
  return true;
// All interfaces were found.
}

這種方式比第一種方式有所改進,接口的定義仍然以注釋的方式實現(xiàn),但是添加了驗證方法,判斷一個類型是否實現(xiàn)了某個接口。
3.鴨子類型(Emulating Interfaces with Duck Typing)
復制代碼 代碼如下:

// Interfaces.
var Composite = new Interface('Composite', ['add', 'remove', 'getChild']);
var FormItem = new Interface('FormItem', ['save']);
// CompositeForm class
var CompositeForm = function(id, method, action) {
  ...
};
...
function addForm(formInstance) {
  ensureImplements(formInstance, Composite, FormItem);
  // This function will throw an error if a required method is not implemented.
  ...
}
// Constructor.
var Interface = function(name, methods) {
  if(arguments.length != 2) {
    throw new Error("Interface constructor called with "
             + arguments.length + "arguments, but expected exactly 2.");
  }
  this.name = name;
  this.methods = [];
  for(var i = 0, len = methods.length; i < len; i++) {
    if(typeof methods[i] !== 'string') {
      throw new Error("Interface constructor expects method names to be "
              + "passed in as a string.");
    }
    this.methods.push(methods[i]);
  }
};
// Static class method.
Interface.ensureImplements = function(object) {
  if(arguments.length < 2) {
    throw new Error("Function Interface.ensureImplements called with "
              +arguments.length + "arguments, but expected at least 2.");
  }
for(var i = 1, len = arguments.length; i < len; i++) {
    var interface = arguments[i];
    if(interface.constructor !== Interface) {
      throw new Error("Function Interface.ensureImplements expects arguments"
              + "two and above to be instances of Interface.");
    }
    for(var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) {
      var method = interface.methods[j];
      if(!object[method] || typeof object[method] !== 'function') {
        throw new Error("Function Interface.ensureImplements: object "
                + "does not implement the " + interface.name + " interface. Method " + method + " was not found.");
      }
    }
  }
};

何時使用接口?
一直使用嚴格的類型驗證并不適合,因為大多數(shù)javascript程序員已經(jīng)在沒有接口和接口驗證的情況下編程多年。當你用設計模式開始設計一個很復雜的系統(tǒng)的時候,使用接口更有益處??雌饋硎褂媒涌诤孟裣拗屏薺avascript的靈活性,但實際上他讓你的代碼變得更加的松耦合。他使你的代碼變得更加靈活,你可以傳送任何類型的變量,并且保證他有你想要的方法。有很多場景接口非常適合使用。
在一個大型系統(tǒng)里,很多程序員一起參與開發(fā)項目,接口就變得非常必要了。程序員經(jīng)常要訪問一個還沒有實現(xiàn)的api,或者為其他程序員提供別人依賴的一個方法存根,在這種情況下,接口變得相當?shù)挠袃r值。他們可以文檔化api,并作為編程的契約。當存根被實現(xiàn)的api替換的時候你能立即知道,如果在開發(fā)過程中api有所變動,他能被另一個實現(xiàn)該接口的方法無縫替換。
如何使用接口?
首先要解決的問題是,在你的代碼中是否適合使用接口。如果是小項目,使用接口會增加代碼的復雜度。所以你要確定使用接口的情況下,是否是益處大于弊端。如果要使用接口,下面有幾條建議:
1.引用Interface 類到你的頁面文件。interface的源文件你可以再如下站點找到: http://jsdesignpatterns.com/.
2.檢查你的代碼,確定哪些方法需要抽象到接口里面。
3.創(chuàng)建接口對象,沒個接口對象里面包含一組相關(guān)的方法。
4.移除所有構(gòu)造器驗證,我們將使用第三種接口實現(xiàn)方式,也就是鴨子類型。
5.用Interface.ensureImplements替代構(gòu)造器驗證。

相關(guān)文章

  • 一文帶你快速學會JavaScript條件判斷及高級用法

    一文帶你快速學會JavaScript條件判斷及高級用法

    JavaScript支持其用于執(zhí)行根據(jù)不同的條件不同的操作條件語句,下面這篇文章主要給大家介紹了關(guān)于如何在JavaScript中更好的使用條件判斷的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • javascript實現(xiàn)復選框選中屬性

    javascript實現(xiàn)復選框選中屬性

    本文給大家介紹的是一篇國外網(wǎng)友寫的博客,講解的是關(guān)于實現(xiàn)復選框選中屬性的問題,感覺非常不錯,翻譯過來推薦給大家,希望小伙伴們能夠喜歡。
    2015-03-03
  • JavaScript+HTML5 canvas實現(xiàn)放大鏡效果完整示例

    JavaScript+HTML5 canvas實現(xiàn)放大鏡效果完整示例

    這篇文章主要介紹了JavaScript+HTML5 canvas實現(xiàn)放大鏡效果,結(jié)合完整實例形式分析了javascript+HTML5 canvas針對圖片元素的獲取、響應鼠標事件變換元素屬性相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • javascript幀動畫(實例講解)

    javascript幀動畫(實例講解)

    下面小編就為大家?guī)硪黄猨avascript幀動畫(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • js實現(xiàn)多個倒計時并行 js拼團倒計時

    js實現(xiàn)多個倒計時并行 js拼團倒計時

    這篇文章主要為大家詳細介紹了js實現(xiàn)多個倒計時并行功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • JavaScript簡單編程實例學習

    JavaScript簡單編程實例學習

    在本篇文章里小編給大家整理的是關(guān)于JavaScript簡單編程實例學習內(nèi)容,有興趣的朋友們可以參考下。
    2020-02-02
  • JavaScript原生對象之String對象的屬性和方法詳解

    JavaScript原生對象之String對象的屬性和方法詳解

    這篇文章主要介紹了JavaScript原生對象之String對象的屬性和方法詳解,本文講解了length、charAt()、charCodeAt()、concat()、indexOf()、lastIndexOf()等方法屬性,需要的朋友可以參考下
    2015-03-03
  • uni-app的基本使用教程

    uni-app的基本使用教程

    uni-app??? 是一個使用 ???Vue.js?? 開發(fā)所有前端應用的框架,開發(fā)者編寫一套代碼,可發(fā)布到iOS、Android、H5、以及各種小程序(微信/支付寶/百度/頭條/QQ/釘釘)等多個平臺,這篇文章主要介紹了uni-app的基本使用,需要的朋友可以參考下
    2022-11-11
  • 如何用threejs實現(xiàn)實時多邊形折射

    如何用threejs實現(xiàn)實時多邊形折射

    這篇文章主要介紹了如何用threejs實現(xiàn)實時多邊形折射,對three.js庫感興趣的同學,可以參考下
    2021-05-05
  • IE中createElement需要注意的一個問題

    IE中createElement需要注意的一個問題

    最近有讀者求助,說在iframe中,創(chuàng)建一個元素,然后添加到父頁面中在ie6,ie7中行不通,而firefox和IE8可以。
    2010-07-07

最新評論