代码之家  ›  专栏  ›  技术社区  ›  lomaxx

javascript中的接口是必要的吗?

  •  22
  • lomaxx  · 技术社区  · 17 年前

    我想这可以应用于任何动态语言,但我使用的是JavaScript。在这种情况下,我们在javascript中编写了一些控件,这些控件需要公开一个send()函数,然后由承载javascript的页面调用该函数。我们有一个对象数组,其中定义了这个发送函数,所以我们遍历集合并对每个对象调用send()。

    在OO语言中,如果您想做类似的事情,您将拥有一个IControl接口,该接口具有一个send()函数,该函数必须由每个控件实现,然后您将拥有一个IControl实现集合,您将迭代并调用send方法。

    我的问题是,在javascript是动态语言的情况下,是否需要定义控件应该继承的接口,或者只调用控件上公开的send()函数就足够了?

    5 回复  |  直到 17 年前
        1
  •  10
  •   John Paulett    17 年前

    动态语言经常鼓励 Duck Typing ,其中,对象的方法决定了应该如何使用它,而不是显式契约(如接口)。

        2
  •  4
  •   Rex M    17 年前

    因为您可以在动态语言中对任何对象调用任何方法,所以我不确定接口如何以任何真正有用的方式发挥作用。没有要强制执行的契约,因为所有内容都是在调用时确定的——对象甚至可以在整个运行时添加和删除方法时,在其生命周期中更改它是否符合“契约”。如果对象不履行合同,则调用将失败;如果对象不实现成员,则调用将失败——对于大多数实际用途,这两种情况都是相同的。

        3
  •  3
  •   stj    11 年前

    这对于PHP也是一样的;您不需要真正的接口。但它们的存在是为了建筑需求。在PHP中,可以为函数指定类型提示,这些提示很有用。

    第二,接口是契约。这是一份正式合同, 此接口中的所有对象都具有这些函数 . 最好确保类满足这些要求,而不是记住:“ 嗯,这个班有 isEnabled() 但另一个是 checkIfEnabled() “。接口帮助您实现标准化。其他处理派生对象的人不必检查名称是否为 isEnabled 或 checkIfEnabled (最好让翻译抓住那些问题)。

        4
  •  2
  •   Steve Tauber    13 年前

    我们在下面的页面中看到了一个很好的实现,这是我们的(它的简短版本)

    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

        5
  •  0
  •   Tengiz    13 年前

    接口的另一个替代方案是 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!