/**
 * 对象操作工具类
 * @author cls
 * @date 2020-05-29
 */

/**
 * showdoc
 * @catalog JS工具类/ObjectUtil
 * @title 接口混入
 * @description Js对象实现多接口混入
 * @method static
 * @url import { mix } from '@birt/funclib/ObjectUtil.js'
 */
export function mix(...mixins) {
  class Mix {
    constructor() {
      for (let mixin of mixins) {
        copyProperties(this, new mixin()); // 拷贝实例属性
      }
    }
  }

  for (let mixin of mixins) {
    copyProperties(Mix, mixin); // 拷贝静态属性
    copyProperties(Mix.prototype, mixin.prototype); // 拷贝原型属性
  }

  return Mix;
}

function copyProperties(target, source) {
  for (let key of Reflect.ownKeys(source)) {
    if (key !== 'constructor'
      && key !== 'prototype'
      && key !== 'name'
    ) {
      let desc = Object.getOwnPropertyDescriptor(source, key);
      Object.defineProperty(target, key, desc);
    }
  }
}
