2009-09-14 74 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!