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
所需的所有内容吗?我意识到我可以将一个函数传递给构造函数。换句话说,如果dependency
是一个函数,那么我们只是调用它。这是最安全的方法吗?我不认为这是MVC项目的作用......有时候传递一个对象也是有意义的。
答案 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。