引用从父级继承的函数中的子类

时间:2015-07-31 22:53:36

标签: javascript oop ecmascript-6

我有方法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

2 个答案:

答案 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;
&#13;
&#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正确。