javascript - 测试对象是否是 Google Closure 类框架中接口(interface)的实现

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

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


我在通过 new my.Dog()object instanceof my.Animal 创建的对象中找不到任何关于 my.Animal 的提示> 没用。关于接口(interface)的唯一信息是忘记在子类中实现方法时出现编译器错误。

/**
 * @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

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

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

最佳答案

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

my.Dog.prototype.implements_my_Animal = true;

然后

if (foo.implements_my_Animal) ...

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

关于javascript - 测试对象是否是 Google Closure 类框架中接口(interface)的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28063982/

相关文章:

javascript - 使用闭包编译器创建结果类型

javascript - TypeScript 可以为 Closure Compiler 输出注释吗?

javascript - 如何判断js是否是闭包编译的

leiningen - 在 clojurescript 中使用最新版本的 google 关闭?

javascript - 溢出在父 div 后面发送下拉列表,z-index 不起作用

javascript - $stateProvider AngularJs 不工作

jquery - Google Closure --process_jquery_primitives 问题(使用 Jquery 导入)

javascript - 如何不编译 goog.closure 中的某些代码 ADVANCED_OPTIMIZATIONS

javascript - JS星级如何获取MYSQL的<span>值?

javascript - AngularJS ng-repeat 显示来自 Json 的二维数组