测试对象是否是Google Closure类框架中的接口实现

时间:2015-01-21 09:46:47

标签: javascript google-closure-compiler google-closure google-closure-library

如何使用Google Closure inheritance mechanism测试JavaScript对象是否是接口的实现?


我在通过my.Animalnew 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

我发现的一种方法是大致测试接口的属性,尽管在很多方面都很糟糕:

console.log(!!dog.doSomething); // returns true

2 个答案:

答案 0 :(得分:2)

@interface纯粹是一种类型检查器构造。在未编译的代码中,没有任何东西可以检查@interface / @implements的注释以添加运行时检查的任何连接。 Closure的目标是代码在编译之前和之后运行相同(假设您观察到正在使用的优化模式的限制)。需要运行时检查时的典型模式是标记实现您感兴趣的接口的类:

my.Dog.prototype.implements_my_Animal = true;

然后

if (foo.implements_my_Animal) ...

这有点烦人,所以你不能在不需要的地方看到它。有多种方法可以包装它,但是,如果使用ADVANCED模式,大多数会导致实现类(示例中的my.Dog)转义,如果未使用则不会被删除。

答案 1 :(得分:1)

你不能直接。

在Closure-compiler类型系统中,@extends用于继承并与instanceof测试相关联。由@implements表示的接口实现严格地是编译时间检查。它们是一个承诺,您的对象包含与接口定义匹配的方法和属性。

因此,要在运行时以全面的方式测试它们,您需要检查接口的每个属性的存在和类型。