Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态附加ES6对象';将方法从一个对象转移到另一个对象_Javascript_Ecmascript 6_Component Design - Fatal编程技术网

Javascript 动态附加ES6对象';将方法从一个对象转移到另一个对象

Javascript 动态附加ES6对象';将方法从一个对象转移到另一个对象,javascript,ecmascript-6,component-design,Javascript,Ecmascript 6,Component Design,我有这样一个基本的组件类 class Component { constructor() { this.manager = null; } behavior(){ //some behavior } } 我希望GameObject的一个实例通过如下操作动态继承该行为 var myGameObject = new GameObject(); myGameObject.attach(myComponent); 这样我就可以轻松做到

我有这样一个基本的组件类

class Component {
    constructor() {
        this.manager = null;
    }
    behavior(){
        //some behavior
    }
}
我希望GameObject的一个实例通过如下操作动态继承该行为

var myGameObject = new GameObject();
myGameObject.attach(myComponent);
这样我就可以轻松做到

myGameObject.behavior();

这可以通过ES6实现吗?如果没有,我还有什么其他选择

我确实找到了这样做的方法,但不确定这是否是一种不好的做法

attach(component){
   Object.assign(this,component);
   while (component = Reflect.getPrototypeOf(component)) {
     if(component == Object.prototype) break; // no need to redefine Object
     let keys = Reflect.ownKeys(component)
     for(var i=1;i<keys.length;i++){
       Reflect.getPrototypeOf(this)[keys[i]] = component[keys[i]];
     }
   }
   return this;
}
附加(组件){
分配(此,组件);
while(component=Reflect.getPrototypeOf(component)){
if(component==Object.prototype)break;//无需重新定义对象
让关键点=Reflect.ownKeys(组件)

对于(var i=1;i我确实找到了这样做的方法,但不确定这是否只是一种不好的做法

attach(component){
   Object.assign(this,component);
   while (component = Reflect.getPrototypeOf(component)) {
     if(component == Object.prototype) break; // no need to redefine Object
     let keys = Reflect.ownKeys(component)
     for(var i=1;i<keys.length;i++){
       Reflect.getPrototypeOf(this)[keys[i]] = component[keys[i]];
     }
   }
   return this;
}
附加(组件){
分配(此,组件);
while(component=Reflect.getPrototypeOf(component)){
if(component==Object.prototype)break;//无需重新定义对象
让关键点=Reflect.ownKeys(组件)

对于(var i=1;i
Object.assign(this,myComponent)
@4castle这只复制对象的属性,没有任何方法可以复制方法,但是您不能在任意对象上调用
Component
的构造函数,因此ES6类可能会在您尝试这样做时遇到一些障碍。
Object.assign(this,myComponent)
@4将此副本仅复制到对象的属性上,而不是任何方法可以复制到方法上,但您不能在任意对象上调用
组件的构造函数,因此ES6类可能会在您尝试这样做时遇到一些障碍。