2009-09-14 51 views
22

我想這可能適用於任何動態語言,但我使用的是JavaScript。我們有一種情況,我們在JavaScript中編寫了幾個控件,需要公開一個Send()函數,然後由託管JavaScript的頁面調用它。我們有一個定義了這個Send函數的對象數組,因此我們遍歷集合並在每個對象上調用Send()。JavaScript中的接口是否必需?

在OO語言中,如果你想做類似的事情,你需要一個IControl接口,它有一個必須由每個控件實現的Send()函數,然後你將擁有一組IControl實現你會遍歷並調用send方法。

我的問題是,JavaScript是一種動態語言,是否需要定義控件應該繼承的接口,還是僅僅調用控件上公開的Send()函數就足夠了?

+4

我喜歡你的gravatar :) – alex 2009-09-14 04:06:31

回答

10

動態語言經常鼓勵Duck Typing,其中對象的方法決定如何使用它而不是明確的契約(如接口)。

+34

我不認爲這個接口是與鴨子打字相反。事實恰恰相反。通過聲明一個接口,你可以清楚地說明你將嘗試調用哪些方法。通常我已經找到了接受對象的方法,比如類似於文件的對象,而沒有明確指出文件類對象應該實現什麼。 read()和close()足夠了嗎?我是否也需要seek()? write()怎麼樣?接口是一種清晰明確的方式來陳述你的需求,因此是一個重大的改進,尤其是**,如果你想依靠鴨子打字 – Andrea 2011-11-11 17:36:43

+2

即使是具有臨時接口的能力,只需聲明什麼方法和成員參數應該是有用的。它不一定是一個有名稱的接口 - 只是一個值約束。 – 2012-10-05 19:16:53

4

由於您可以用動態語言調用任何對象上的任何方法,我不確定接口如何以任何真正有用的方式發揮作用。沒有合同可以執行,因爲所有內容都是在調用時確定的 - 一個對象甚至可以改變它是否符合「合約」的整個生命週期,因爲方法在運行時被添加和刪除。如果對象沒有履行合同,那麼調用就會失敗,或者如果它沒有實現成員,它會失敗 - 兩種情況在大多數實際情況下都是相同的。

+0

有一個[科諾(http://web.archive.org /web/20120416022026/http://knol.google。com/k /編程接口在JavaScript中是的,它可以做,呃,我的意思,假的#)(是knol)關於這個主題 – bobobobo 2014-01-23 02:13:15

3

這與PHP相同;你並不需要接口。但它們存在於建築需求中。在PHP中,您可以爲可能有用的函數指定類型提示。

二,界面是合同。這是一個正式的合同,這個界面的所有對象都有這些功能。最好確保你的班級滿足這些要求,而不是記住:「毫米,這個班級有isEnabled(),但另一個是checkIfEnabled()」。接口可以幫助您實現標準化。其他工作在派生對象上的人不必檢查名稱是isEnabled還是checkIfEnabled(最好讓解釋器捕獲這些問題)。

2

我們看到下面的頁面一個很好的實現,這是我們(短版吧)

var Interface = function (methods) { 
    var self = this; 
    self.methods = []; 

    for (var i = 0, len = methods.length; i < len; i++) { 
     self.methods.push(methods[i]); 
    } 

    this.implementedBy = function (object) { 

     for (var j = 0, methodsLen = self.methods.length; j < methodsLen; j++) { 
      var method = self.methods[j]; 
      if (!object[method] || typeof object[method] !== 'function') { 
       return false; 
      } 
     } 
     return true; 
    } 
}; 

//Call 
var IWorkflow = new Interface(['start', 'getSteps', 'end']); 
if (IWorkflow.implementedBy(currentWorkFlow)) { 
    currentWorkFlow.start(model); 
} 

整個例子是: http://www.javascriptbank.com/how-implement-interfaces-in-javascript.html

0

另一替換接口是由提供bob.js

1.檢查接口實現:

var iFace = { say: function() { }, write: function() { } }; 
var obj1 = { say: function() { }, write: function() { }, read: function() { } }; 
var obj2 = { say: function() { }, read: function() { } }; 
console.log('1: ' + bob.obj.canExtractInterface(obj1, iFace)); 
console.log('2: ' + bob.obj.canExtractInterface(obj2, iFace)); 
// Output: 
// 1: true 
// 2: false 

2.從對象中提取接口和仍能正常執行功能:

var obj = { 
    msgCount: 0, 
    say: function (msg) { console.log(++this.msgCount + ': ' + msg); }, 
    sum: function (a, b) { console.log(a + b); } 
}; 
var iFace = { say: function() { } }; 
obj = bob.obj.extractInterface(obj, iFace); 
obj.say('Hello!'); 
obj.say('How is your day?'); 
obj.say('Good bye!'); 
// Output: 
// 1: Hello! 
// 2: How is your day? 
// 3: Good bye! 
相關問題