在JavaScript的接口有必要吗?(Are Interfaces in JavaScript n

2019-08-05 21:05发布

我想这可以适用于任何动态语言,但我使用的一个是JavaScript的。 我们有我们正在写一对夫妇在JavaScript中需要暴露出的send()函数,然后由承载JavaScript的网页称为控件的情况。 我们有一个包含了定义此发送函数对象的数组,所以我们通过收集和重复发送呼叫()对每个对象。

在面向对象的语言,如果你想要做同样的事情,你必须有必须由每个控制实施的发送()函数的iControl接口,然后你必须ICONTROL实现,你会遍历集合通过并调用发送方法。

我的问题是,用JavaScript是一门动态语言,是否有任何需要确定其控制方式应该继承的接口,或者是它不够好,只是调用发送露出上的控件()函数?

Answer 1:

动态语言经常鼓励鸭打字 ,其中对象的方法决定应该如何使用,而不是一个明确的合同(如接口)。



Answer 2:

既然你可以调用任何对象的任何方法在动态语言,我不知道接口是如何发挥作用的任何真正有用的方式。 有没有合同执行,因为一切都在调用时确定的 - 一个对象甚至可以改变它是否符合一个“契约”通过它的生活方法添加和整个运行时间删除。 如果对象不履行合同的通话将失败,或者如果它没有实现的成员将会失败 - 这两种情况下是最实用的目的是相同的。



Answer 3:

这是PHP一样的; 你并不真正需要的接口。 但它们存在于建筑需求。 在PHP中,你可以指定功能,这可能是有用的类型提示。

其次,接口是一个合同。 这是从这个接口的所有对象都具有这些功能的正式合同。 更好地确保你的类满足这些要求,而不是记住:“MM,这个类isEnabled()但另一种是checkIfEnabled() ”。 接口帮助您标准化。 其他派生的对象上的工作没有检查名称是否是isEnabledcheckIfEnabled (最好让翻译赶上这些问题)。



Answer 4:

我们看到在页面下方一个很好的实现,这是我们(短版吧)

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



Answer 5:

在接口另一种方法是通过提供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! 


文章来源: Are Interfaces in JavaScript necessary?