谷歌闭包编译器:如何在使用工厂时进行继承
Google closure compiler: How to do inheritance when using a factory
假设我有一辆车。
/**
*
* @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
注释。
相关文章:
- Angularjs工厂注入错误
- 如何将参数传递到angularJs中的工厂
- 从控制器继承了隔离的作用域以生成可重用的指令
- 为什么只有工厂在棱角分明的网站上被提及
- AngularJS:$q.dedefe()不能由工厂方法共享
- 两个指令创建新的继承的和隔离的作用域-元素得到哪个
- Angular,函数在(模型)工厂中返回值
- AngularJS错误:提供程序必须从$get工厂方法返回值
- 如何使用异步调用更改工厂的变量
- 将变量传递到工厂
- 当使用控制器作为语法时,如何从父指令继承属性
- 以jquery方式继承Javascript
- 注入工厂时,Angular停止工作
- 如何在具有某些 UI 视图的状态中管理工厂单个请求数据
- JavaScript对象不是从原型链继承的
- AngularJS:多个工厂实例任何原型继承
- 尝试使用工厂进行继承,但它不会继承并给出一些错误
- ECMAScript 5定义了用于构造和继承的通用工厂模式[Object.create()]
- 谷歌闭包编译器:如何在使用工厂时进行继承
- 工厂中的角继承