Seb*_*rth 5 javascript google-closure google-closure-library google-closure-compiler
如何使用Google Closure继承机制测试JavaScript对象是否是接口的实现?
我找不到任何暗示my.Animal在通过创建对象new my.Dog()并object instanceof my.Animal没有奏效.忘记在子类中实现方法时,有关接口的唯一信息是编译器错误.
/**
* @interface
*/
my.Animal = function() {};
/**
* Does something.
* @return {string}
*/
my.Animal.prototype.doSomething;
/**
* @constructor
* @implements {my.Animal}
*/
my.Dog = function() {};
/** @inheritDoc */
my.Dog.prototype.doSomething() = function {
return "something";
}
var dog = new my.Dog();
console.log(dog instanceof my.Animal); // returns false
Run Code Online (Sandbox Code Playgroud)
我找到的一种方法是大致测试接口的属性,尽管这在很多方面都很糟糕:
console.log(!!dog.doSomething); // returns true
Run Code Online (Sandbox Code Playgroud)
@interface纯粹是一个类型检查器构造。@interface在未编译的代码中,没有任何内容可以检查/的注释@implements来添加任何运行时检查的接线。Closure 的目标是代码在编译之前和之后运行相同(假设您遵守正在使用的优化模式的限制)。需要运行时检查时的典型模式是标记实现您感兴趣的接口的类:
my.Dog.prototype.implements_my_Animal = true;
Run Code Online (Sandbox Code Playgroud)
然后
if (foo.implements_my_Animal) ...
Run Code Online (Sandbox Code Playgroud)
这有点烦人,所以你在不需要的地方看不到它。有多种方法可以对此进行包装,但是,如果您使用高级模式,大多数会导致实现类(示例中的 my.Dog)转义并且如果未使用则不可删除。