Javascript 通量存储:为什么要扩展EventEmitter.prototype?

Javascript 通量存储:为什么要扩展EventEmitter.prototype?,javascript,reactjs-flux,flux,eventemitter,Javascript,Reactjs Flux,Flux,Eventemitter,我能找到的每个官方流量示例都使用此模式创建存储: var MyStore = assign({}, EventEmitter.prototype, { ... }); 我不明白为什么我们直接在MyStore对象上分配方法,而我们可以通过使MyStore成为EventEmitter的实例来继承这些方法: var MyStore = assign(new EventEmitter(), { ... }); 有人知道这种模式背后的原理吗?特别是因为它通常被误读,导致如下错误: var My

我能找到的每个官方流量示例都使用此模式创建存储:

var MyStore = assign({}, EventEmitter.prototype, {
  ...
});
我不明白为什么我们直接在
MyStore
对象上分配方法,而我们可以通过使
MyStore
成为
EventEmitter
的实例来继承这些方法:

var MyStore = assign(new EventEmitter(), {
  ...
});
有人知道这种模式背后的原理吗?特别是因为它通常被误读,导致如下错误:

var MyStore = assign(EventEmitter.prototype, {
  ...
});
如果我大胆猜测,我会说这是因为他们不想调用EventEmitter构造函数,他们想让您轻松地链接更多的原型,比如:

var MyStore = assign({}, EventEmitter.prototype, A.prototype,
                     B.prototype, C.prototype, randomObject, {
  ...
});

一般来说,Javascript中有一种偏向于组合而不是继承。我想你可能会发现有人在争论继承的问题,但是,抛开任何关于哪个在概念上更优越的争论不谈,JS中继承的一个优势是它可以让一个人简单地模拟多重继承(这在JS中是不可能的)

Object.assign()
进入ES6之前,像jQuery、下划线/lodash和prototype这样的库都有类似的函数名为
extend()
(lodash至少现在将其别名命名为
assign
函数)。在我看来,
extend
名称是一个更容易理解它是如何/为什么被使用的线索,但它只是一个名称。我认为有些库也有名为“mixin”的函数——这是同样的处理方法,而且组合的使用有时被称为使用“mixin”

因此,这个问题(以及它的首要答案)可能会引起人们的兴趣


与许多Javascript习惯用法一样,可能需要一些时间才能习惯,特别是如果您有经典的OO背景。但是接受这个习惯用法,你就会习惯于更容易地发现你在问题末尾提到的那种错误,就像你习惯于处理闭包、异步代码和所有其他让Javascript变得疯狂和美妙的东西一样。

assign()
/
extend()
在技术上并不进行组合或继承,尽管它大致类似于多重继承。我并不经常在JavaScript中看到真正的组合,但我一直看到这种模式。@wolverdude-所以在我的回答中,我说它允许模拟多重继承。我没说是多重继承。如果我没有回答你的问题,请告诉我。@wolverdude-另外,请澄清你所说的“真实合成”是什么意思,以及Javascript中的“真实合成”示例(因为你说你不经常看到它,这意味着你偶尔会看到它)。