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 继承来扩展它,因为没有您可以作为父级提供的构造函数。
换句话说,这两个不同的代码块是否完全等价?
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 继承来扩展它,因为没有您可以作为父级提供的构造函数。