Mixin 模式的实现

Mixin 指的是多个对象合成一个新的对象,新对象具有各个组成成员的接口。它的最简单实现如下。

  1. const a = {
  2. a: 'a'
  3. };
  4. const b = {
  5. b: 'b'
  6. };
  7. const c = {...a, ...b}; // {a: 'a', b: 'b'}

上面代码中,c对象是a对象和b对象的合成,具有两者的接口。

下面是一个更完备的实现,将多个类的接口“混入”(mix in)另一个类。

  1. function mix(...mixins) {
  2. class Mix {
  3. constructor() {
  4. for (let mixin of mixins) {
  5. copyProperties(this, new mixin()); // 拷贝实例属性
  6. }
  7. }
  8. }
  9. for (let mixin of mixins) {
  10. copyProperties(Mix, mixin); // 拷贝静态属性
  11. copyProperties(Mix.prototype, mixin.prototype); // 拷贝原型属性
  12. }
  13. return Mix;
  14. }
  15. function copyProperties(target, source) {
  16. for (let key of Reflect.ownKeys(source)) {
  17. if ( key !== 'constructor'
  18. && key !== 'prototype'
  19. && key !== 'name'
  20. ) {
  21. let desc = Object.getOwnPropertyDescriptor(source, key);
  22. Object.defineProperty(target, key, desc);
  23. }
  24. }
  25. }

上面代码的mix函数,可以将多个对象合成为一个类。使用的时候,只要继承这个类即可。

  1. class DistributedEdit extends mix(Loggable, Serializable) {
  2. // ...
  3. }