谷歌闭包编译器:如何在使用工厂时进行继承

Google closure compiler: How to do inheritance when using a factory

本文关键字:工厂 继承 编译器 闭包 谷歌      更新时间:2023-09-26

假设我有一辆车。

/**
 *
 * @constructor
 * @extends {Component}
 */
obj.Car = function(prop1, prop2) {
    goog.base(this, prop1);
    this.prop2 = prop2;
};
goog.inherits(obj.Car, Component);
/**
 * 
 * @return {obj.Car}
 */
obj.Car.create = function(a,b,c) {
    var prop1 = obj.Car.createProp1(a,b,c);
    var prop2 = obj.Car.createProp2(a,b,c);
    return new obj.Car(prop1, prop2);
 }

酷。现在我想把车改装一下。称之为超级汽车。

obj.SuperCar = function(prop1,prop2) {
    goog.base(this, prop1, prop2);
};
goog.inherits(obj.SuperCar, obj.Car);

如何为SuperCar编写工厂创建方法,以便其他类也可以扩展SuperCar?

因此,理想情况下:

/**
 * @return {obj.SuperCar} 
 */
obj.SuperCar.create() = function() {
    return /** type {obj.SuperCar} */ Obj.Car.create.apply(this, arguments);
};

然而,这意味着我必须将obj.Car更改为:

/**
 * @this {*) ????????? only this works
 * @return {obj.Car}
 */
obj.Car.create = function(a,b,c) {
    var prop1 = obj.Car.createProp1(a,b,c);
    var prop2 = obj.Car.createProp2(a,b,c);
    return new this(prop1, prop2);
};

这个Javascript实际上是在未编译和编译的情况下运行的。但是我在运行编译时得到了一个TypeError。有人知道这方面的最佳解决方案吗?我试过几件事,但似乎都做不好。

我假设这是基类。

SuperCar.js

/**
 * @constructor
 */
obj.SuperCar = function() {
};
/**
 * @return {obj.SuperCar}
 */
obj.SuperCar.create = function() {
   return new obj.SuperCar();
}

Car.js

/**
 * @param {*} prop1
 * @constructor
 * @extends {obj.SuperCar}
 */
obj.Car = function(prop1) {
    goog.base(this);
    this.prop1 = prop1;
};
goog.inherits(obj.Car, obj.SuperCar);
/**
 * @param {*} prop1
 * @return {obj.Car}
 * @override
 */
obj.SuperCar.create = function(prop1) {
   return new obj.Car(prop1);
}

通常,如果要覆盖函数,可以使用/** @inheritDoc */注释,或者如果要更改函数定义,则编写新的函数定义并添加@override注释。