首頁 >web前端 >js教程 >javascript設計模式 介面介紹_javascript技巧

javascript設計模式 介面介紹_javascript技巧

WBOY
WBOY原創
2016-05-16 17:51:481183瀏覽

這本書中第一個重要的內容就是介面。

大家對介面應該都不陌生,簡單的說介面就是一個契約或規範。在強類型的面相物件語言中,介面可以很容易的實作。但是在javascript中並沒有原生的創建或實現接口的方式,或者判定一個類型是否實現了某個接口,我們只能利用js的靈活性的特點,模擬接口。
在javascript中實作介面有三種方式:註解描述、屬性驗證、鴨子模型。
note:因為我看的是英文書,翻譯程度有限,不知道有些詞彙如何翻譯,大家只能領會精神了。
1. 註解描述(Describing Interfaces with Comments)
範例:

複製程式碼



複製程式碼


程式碼如下
/*
interface Composite {
  function add(child);
  function remove(child);
 》function getChild(index); {
  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() {
...
};


模擬其他物件導向語言,使用interface 和implements關鍵字,但是需要將他們註解起來,這樣就不會有語法錯誤。
這樣做的目的,只是為了告訴其他程式設計人員,這些類別需要實作什麼方法,需要在程式設計的時候加以注意。但是沒有提供一種驗證方式,這些類別是否正確實作了這些介面中的方法,這種方式就是一種文檔化的作法。
2. 屬性驗證(Emulating Interfaces with Attribute Checking) 範例:複製程式碼


複製程式碼



複製程式碼



複製程式碼



複製程式碼



複製程式碼



複製程式碼



複製程式碼



複製碼>

/* interface
Composite {
function add(child);
function remove(child);
function getChild(index);
} 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 che to sobectif 🎜> 🎜>// implements the required interfaces. function implements(object) {
  for(var i = 1; i     // Looping through all arguments     / / after the first one.     var interfaceName = arguments[i];     var interfaceFound = false;    var interfaceFound = false;    。 interfaceFound = false;    皮〠); 🎜>      if (object.implementsInterfaces[j] == interfaceName) {         interfaceFound = true;     interfaceFound = true;         }     if(!interfaceFound) {       return false; // An interface was not found.    }   }   return true; // All interfaces were found. } // All interfaces were found. } 3.鴨子類型(Emulating Interfaces with Duck Typing) 複製程式碼 程式碼如下:

// 介面。
var Composite = new Interface('Composite', ['add', 'remove', 'getChild']);
var FormItem = new Interface('FormItem', ['save']);
// CompositeForm 類別
var CompositeForm = function(id, method, action) {

};
...
function addForm(formInstance) {
確保Impleatments(formInstanceImplements , Composite, FormItem);
// 如果未實作所需的方法,此函數將拋出錯誤。
……
}
// 建構子。
var Interface = function(name,methods) {
if(arguments.length != 2) {
拋出new Error("介面建構子使用"
參數.length" 參數調用,但符合預期正好2。 i IF(typeofmethods[i] !== 'string') {
拋出new Error("介面建構子期望方法名稱為「
作為字串傳入。 」);
🎜}
this.methods.push(methods[i]);
★}
};
// 靜態類別方法。
Interface.ensureImplements = function (object) {
if(arguments.length 拋出new Error("Function Interface.ensureImplements 使用"

參數.length 參數調用,但是預計至少2個。 >if(interface.constructor !== Interface) {
拋出new Error("Function Interface.ensureImplements 需要參數"
「兩個以上是Interface 的實例。」);
🎜}
for(var j = 0,methodsLen = interface.methods.length; j 🎜>var method = interface.methods[j];
如果(!object[method] | | typeof object[method] !== 'function') {
拋出new Error("Function Interface.ensureImplements: 物件"










「未實現」介面.name「介面。未找到方法」方法「。 」);
🎜>🎜}
🎜}
};

何時使用介面?
驗證不適合,因為大多數javascript程式設計師已經處於沒有介面和介面驗證的情況下程式設計很多年。使用介面限制了javascript的靈活性,但實際上他讓你的程式碼變得更加鬆散耦合。 。提供別人依賴的一個方法存根,在這種情況下,介面變得相當的有價值。開發過程中api震動,他可以被另一個實現該介面的方法無縫替換。項目,使用介面會增加程式碼的複雜度。的頁面檔。 ,沒有一個介面物件裡麵包含一組相關的方法。器驗證。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn