在ES6中将继承的类复制到另一个

时间:2016-10-13 13:35:04

标签: javascript ecmascript-6

任何人都知道如何从继承的类中获取所有属性并将当前属性放在一个带有ES6的Object中?

export class MainClass  {

   constructor(classInstance) {} 

   myMethodMain {
     //doSomhethig
   }  
}

file 2

class Another extends MainClass {

  constructor(config) {
      this.name = 'testing';
  }

  myMethodAnother {
  //doSomhethig
  }
}

file 3

class RandomClass {
    constructor() {
      this.name = 'test';
    }
    myMethodRamdonChild { 
    //doSomhethig
    }
}

file 3

class RandomChild extends RandomClass {
    myMethodRamdonChild {
    //doSomhethig
   }
}

export const myMainClass = new Another(new RandomChild());

我需要在MainClass的构造函数中复制RandomChild和超类RandomClass的所有属性,并保持当前类的当前属性。 在最后我需要一个具有所有属性的Object。

newObject{
  myMethodMain {
  //doSomhethig
  }
  myMethodAnother {
  //doSomhethig
  }
  myMethodRamdonChild { 
    //doSomhethig
  }
  myMethodRamdonChild {
    //doSomhethig
  }
}

我尝试过使用(_.merge, _.copy, angular.copy, angular.merge, $.merge, Object.assign, Object.merge)和其他方法。

重要提示:我无法更改当前结构

1 个答案:

答案 0 :(得分:1)

我解决了这个问题。

export const bind = (target) => (obj) => isFunction(target) ? target.bind(obj) : target;

export const pack = (keys) => (obj) => keys.reduce((res, key) => Object.assign(res, {[key]: bind(obj[key])(obj)}), {});

export const getAllProperties = (o) => {
    let results = [];

    function properties(obj) {
        let props, i;
        if (obj == null) {
            return results;
        }
        if (typeof obj !== 'object' && typeof obj !== 'function') {
            return properties(obj.constructor.prototype);
        }
        props = Object.getOwnPropertyNames(obj);
        i = props.length;
        while (i--) {
            if (!~results.indexOf(props[i])) {
                results.push(props[i]);
            }
        }
        return properties(Object.getPrototypeOf(obj));
    }

    return properties(o);
};

Object.assign(self, pack(getAllProperties(jmi))(jmi));

self拥有我班级的所有属性:)