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

时间:2015-04-09 20:41:51

标签: ecmascript-6

换句话说,这两个不同的代码块完全相同吗?

ES6类扩展基于

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类扩展,但我担心两者之间存在微妙的差异所以我应该坚持使用Object.assign。

1 个答案:

答案 0 :(得分:2)

不,这些代码块不等同

在类继承示例中,您将获得一个新的构造函数,该对象使对象具有父类的功能。

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

与子类不同,扩展后的实例仍然会将constructor属性指向Parent。这意味着您无法识别非扩展中的扩展子级,因为它们都具有相同的构造函数,而运算符instanceof将给出相同的结果。此外,您无法访问子级中被覆盖的方法,因为您将失去与其相关的链接。

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