如何在javascript中扩展抽象类并为闭包编译器注释但没有闭包库?

时间:2016-10-11 20:25:07

标签: javascript annotations abstract-class google-closure-compiler

说我有一个抽象类

/**@constructor
 * @abstract*/
function AbsFoo(){}

/**@return {number}
 * @param {number} a
 * @param {number} b */
AbsFoo.prototype.aPlusB = function(a,b){
    return a + b
};

/**@abstract
 * @return {number}
 * @param {number} c
 * @param {number} d */
AbsFoo.prototype.cMinusD = function(c,d){}; //extending class need to implement.

我希望扩展这个类,通常,我会做类似

的事情
/**@constructor
 * @extends {AbsFoo} */
function Foo(){
    AbsFoo.apply(this);
}

Foo.prototype = new AbsFoo();
Foo.prototype.constructor = Foo;

Foo.prototype.doSomething = function(c,d){
    return c - d;
};

但是闭包编译器说

JSC_INSTANTIATE_ABSTRACT_CLASS: cannot instantiate abstract class

引用第Foo.prototype = new AbsFoo();

那么我将如何以保持原型继承的方式执行此操作,并且能够在类链中一直使用instanceof,还能使编译器满意吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下我使用goog.inherits。由于您不想使用闭包库,因此您只能复制goog.inherits closure-library/closure/goog/base.js。也许给它起名googInherits。代码是这样的:

/**@constructor
 * @extends {AbsFoo}
 */
Foo = function(){
    AbsFoo.apply(this);
}
googInherits(Foo, AbsFoo);

/** @inheritDoc */
Foo.prototype.cMinusD = function(c,d){
    return c - d;
};