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

2024-01-04

如何使用以下方法测试 JavaScript 对象是否是接口的实现Google Closure继承机制 https://developers.google.com/closure/library/docs/introduction?


我找不到任何提示my.Animal在通过创建的对象中new my.Dog() and 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

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

my.Dog.prototype.implements_my_Animal = true;

then

if (foo.implements_my_Animal) ...

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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