Javascript - 没有实现合同的依赖注入(接口)

时间:2015-07-15 20:27:21

标签: javascript

javascript新手。让我们说我有这样的构造函数:

function Dependent(dependency) {
    this.doSomething = function(x) {
       dependency.doSomethingReal(x);
    }
}

var impl = new SomeImplementation();
var dependent = new Dependent(impl);
console.log(dependent.doSomething(3));

我的理解是语言中没有任何东西可以帮助确保impl实际上可以履行其职责(实际上有一个名为doS​​omethingReal的方法,它接受一个参数)。

出现了一些问题:

  1. 在构造函数中,我应该手动检查dependency参数,以确保它具有Dependent所需的所有内容吗?
  2. 我应该不担心吗?
  3. 其他图书馆如何处理这种情况?例如,我知道有一些DI项目......或MVC项目,例如要求他们的视图对象实现某些众所周知的方法。
  4. 我意识到我可以将一个函数传递给构造函数。换句话说,如果dependency是一个函数,那么我们只是调用它。这是最安全的方法吗?我不认为这是MVC项目的作用......有时候传递一个对象也是有意义的。

2 个答案:

答案 0 :(得分:1)

您可以使用instanceof检查对象是否是另一个对象的实例。

例如,在您的代码中:

function Dependent(dependency) {

    // here we could check that dependency is an instance of SomeImplementation
    if (!(dependency instanceof SomeImplementation))
        throw "dependency must be an instance of SomeImplementation";

    this.doSomething = function(x) {
        dependency.doSomethingReal(x);
    }
}

var impl = new SomeImplementation();
var dependent = new Dependent(impl);
console.log(dependent.doSomething(3));

在javascript中,使用“duck typing”方法验证对象也很常见。例如:

console.log (
    'isABird' in duck &&
    'walks' in duck &&
    'swims' in duck &&
    'quacks' in duck ?
    "juhm... I'm pretty sure we're dealing with a duck" :
    "meh... since I a expect a duck to be a bird, walks, swims and quacks, then this buddy is definitely not a duck"
);

答案 1 :(得分:0)

好吧,据我所知,Duck Typing是在JavaScript中处理这个问题的自然方式,因为JavaScript不是一种严格的类型语言。

因此,这意味着您确实只是接受,JavaScript是松散类型的,并且当您尝试访问没有此方法的对象上的方法时,您将不得不处理运行时错误。 (您的选择2)

除此之外,您可以使用一种模式来尝试模拟JavaScript中的接口或抽象类,其工作方式与您在选项1中的建议类似,详细说明如下:

http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#decoratorpatternjavascript (章节"伪古典装饰者")

但这也会导致运行时错误。例外可能会提前一点但不会在编译时间#34;因此,在这两种设计中,您都需要测试应用程序,以便找到与类型相关的错误。

所以我试着接受Duck Typing。