混元(Mix-ins)

既然谈到了通过复制属性来继承,就让我们顺便多说一点,来讨论一下“混元”模式。除了前面说的从一个对象复制,你还可以从任意多数量的对象中复制属性,然后将它们混在一起组成一个新对象。

实现很简单,只需要遍历传入的每个参数然后复制它们的每个属性:

  1. function mix() {
  2. var arg, prop, child = {};
  3. for (arg = 0; arg < arguments.length; arg += 1) {
  4. for (prop in arguments[arg]) {
  5. if (arguments[arg].hasOwnProperty(prop)) {
  6. child[prop] = arguments[arg][prop];
  7. }
  8. }
  9. }
  10. return child;
  11. }

现在我们有了一个通用的混元函数,我们可以传递任意数量的对象进去,返回的结果将是一个包含所有传入对象属性的新对象。下面是用法示例:

  1. var cake = mix(
  2. {eggs: 2, large: true},
  3. {butter: 1, salted: true},
  4. {flour: "3 cups"},
  5. {sugar: "sure!"}
  6. );

图6-10展示了在Firebug的控制台中用console.dir(cake)展示出来的混元后cake对象的属性。

图6-10 在Firebug中查看cake对象

图6-10 在Firebug中查看cake对象

如果你习惯了某些将混元作为原生部分的语言,那么你可能期望修改一个或多个父对象时也影响子对象。但在这个实现中这是不会发生的事情。这里我们只是简单地遍历、复制自有属性,并没有与父对象有任何链接。