Javascript -没有实现契约(接口)的依赖注入
Javascript - Dependency Injection without implementation-contract (interface)
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实际上可以履行其职责(实际上有一个名为doSomethingReal的方法接受一个参数)。
出现了几个问题:
- 在构造函数中,我应该手动检查
dependency
参数以确保它具有Dependent
所需的所有东西吗? - 我不应该担心它吗?
- 其他库如何处理这种情况?例如,我知道有几个DI项目……或MVC项目,例如,要求他们的视图对象实现某些众所周知的方法。
我意识到我可以把一个函数传递给构造函数。换句话说,如果dependency
是一个函数,我们就调用它。这是最安全的方法吗?我不认为这是MVC项目做的…有时传入一个对象也是有意义的。
您可以使用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"
);
嗯,据我所知,Duck Typing将是处理JavaScript中这个问题的自然方法,因为JavaScript不是严格类型的语言。
因此,这将意味着您确实只是接受,JavaScript是松散类型的,并且当您试图访问没有此方法的对象上的方法时,您将不得不处理运行时错误。(你的选项2)
除此之外,你还可以使用一个模式来模拟JavaScript中的接口或抽象类,就像你在选项1中建议的那样,这里有详细描述:
http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/decoratorpatternjavascript(章节"伪古典装饰师")
但是这也会导致运行时错误。异常可能会更早一点出现,但不会在"编译时"出现。因此,在这两种设计中,您都需要测试应用程序,以查找与类型相关的错误。
所以我愿意接受Duck Typing
相关文章:
- 在自定义mean.io包中使用angular-chart.js作为依赖项
- 为什么Airbnb风格指南说不鼓励依赖函数名称推断
- 如何在GoogleWeb工具包(GWT)中从JSNI调用接口(实例化)
- RubyonRails——构建交互式接口应该朝哪个方向发展
- Ember.js-接口状态应该存储在哪里
- 将依赖外部库的UMD模块与browserfy捆绑在一起
- 如何将本地依赖项添加到npm项目中
- 如何在内联依赖项并将图像转换为dataURI的情况下完全提取网页
- 理解typescript中的构造函数接口
- jquery中的复选框依赖项
- 为什么react/redux前端项目在package.json中包含生产依赖项
- 单元测试依赖关系没有被嘲笑
- 依赖<选择>HTML和JavaScript菜单
- FRP 中 EventStreams 的循环依赖关系
- 节点模块依赖关系
- 如何建立一个网页,检查我的路由器网络接口是否可以访问
- 使用多个依赖项加载只进行一次AJAX调用
- 限制npm依赖模块's require(隔离)的用法
- Node中的依赖注入和接口
- Javascript -没有实现契约(接口)的依赖注入