ES6 class extend 是否完全等同于基于 Object.assign 的对象扩展?

Is ES6 class extend fully equivalent to Object.assign based extending of an object?

换句话说,这两个不同的代码块是否完全等价?

ES6 class 基于扩展

class Child extends Parent {
    // Define my subclass
}
var myInstance = new Child();

Object.assign 基于

var myInstance = Object.assign(new Parent(), {
   // Define my subclass
}

在我的特定用例中,我正在尝试扩展(Facebook 的)Flux Dispatcher。在他们的示例中,他们使用 Object.assign。我想扩展 ES6 class,但我担心两者之间存在细微差别,所以我应该坚持使用 Object.assign。

不,这些代码块不等价

在 class 继承示例中,您将获得一个新的构造函数,它使对象具有来自父 class 的特征。

通过 Object.assign 扩展对象是 mixins 的一个例子。 您只需向一个实例添加一些属性,但不会更改所有未来的子实例。

与子 classes 不同,扩展后的实例仍将 constructor 属性 指向 Parent。这意味着您无法在非扩展中识别扩展子,因为它们都有相同的构造函数和运算符 instanceof 将给出相同的结果。此外,您无法访问子项中的重写方法,因为您将失去 link。

至于 flux 的调度程序 in this example,您不能通过 class 继承来扩展它,因为没有您可以作为父级提供的构造函数。