我有方法a来装饰给定的对象数组:
class Vehicle {
static fromArray(vals) {
return vals.map((v) => { return new Vehicle(v); });
}
}
...我想扩展它以处理一系列子类:
class Boat extends Vehicle {
}
class Car extends Vehicle {
}
Car.fromArray([{name: 'volvo'}]) // should return Car objects, not Vehicle
如何在父母中替换Vehicle
?或者我是否必须覆盖子对象中的fromArray
?
答案 0 :(得分:1)
您可以稍微修改一下代码:
'use strict'
class Vehicle {
static fromArray(vals) {
var constr = this; // <-- don't need this if you use an arrow function below
return vals.map(function(v) { return new constr(v); });
}
}
class Boat extends Vehicle {
}
class Car extends Vehicle {
drive() { console.log('driving'); }
}
var base = Vehicle.fromArray([1])[0];
var car = Car.fromArray([1])[0];
car.drive();
//base.drive(); // <-- will throw exception
&#13;
这里的关键是对于静态方法,this
变量设置为类型本身,因此您可以new this()
创建相同类型的对象。
注意:这是在Chrome(V8)上进行测试的,因此应该使用Node / iojs, BUT ,我不是100%确定这是根据规范。
答案 1 :(得分:1)
在静态方法中,this
上下文通常是构造函数本身,因此您可以使用它而不是明确地引用Vehicle
:
class Vehicle {
static fromArray(vals) {
return vals.map(v => new this(v));
}
}
请注意,静态方法没有绑定,因此如果您将它们作为回调引用,那么您必须关心如何使this
正确。