【问题标题】:How to copy properties of one class to another in javascript, including methods如何在javascript中将一个类的属性复制到另一个类,包括方法
【发布时间】:2021-04-01 16:39:38
【问题描述】:

我有两个相互独立工作的类 A 和 B,但有时我想一起创建它们,以便 A 中的函数调用 B 中的函数。这可以通过从 A 扩展 B 来轻松完成,从而覆盖这些方法,但这不允许我独立于 A 创建 B。 相反,我想复制所有的属性和方法。我试过使用Object.assign,下面的例子说明了这个问题。

class A {
    myFunc() {
        throw 'I have not been created yet'
    }   
}
class B {
    myFunc() {
        console.log(`it's all good now!`)
    }
}

let a = new A();
let b = new B();
Object.assign(a, b)

// explicitly copying the method works
//a.myFunc = b.myFunc;

a.myFunc();

问题是:有没有办法不显式地复制所有方法?

【问题讨论】:

  • 我很感兴趣这个用例是什么?
  • 我有一个对象来处理客户及其所有客户的约会,以及发生不同事件时相关的所有逻辑(例如创建新约会)。然后我有另一个对象,它在发生不同事件时生成消息并将它们发送给他们的客户。他们一起创建了一个消息系统。但是消息对象单独用于生成预设消息并允许客户更改他们的消息。并且逻辑对象也是独立的,因此它可以被另一个对象扩展,例如。用于发送包而不是发送消息。
  • 听起来更好的方法可能是将逻辑导出为实用程序样式的 ES6 模块并在其他 2 个类中使用它。从长远来看,继承将比手动复制方法更易于维护。
  • 所以你应该在类外的函数中写myFunc() { console.log(this.name) }而不是myFunc(customer) { console.log(customer.name) }。在专用文件中编写实用程序函数并使用 ES6 模块(正如 BlueWater86 建议的那样)导入它们允许您将它们逻辑捆绑在一起,而不必将它们放在类中。
  • 是的,我可以让逻辑对象将另一个“执行器对象”作为参数,其中包含在逻辑对象发出事件时更新的函数。如果这是建议的内容?这个问题很难解释。

标签: javascript class object copy extends


【解决方案1】:

您可以通过以下方式迭代B的原型的属性名称并将它们分配给不包括构造函数的a的实例:

class A {
    myFunc() {
        throw 'I have not been created yet'
    }   
}
class B {
    myFunc() {
        console.log(`it's all good now!`)
    }
}


let a = new A();
let b = new B();
//Object.assign(a, b)

for (const prop of Object.getOwnPropertyNames(B.prototype).filter(prop => prop !== "constructor"))
  a[prop] = B.prototype[prop]

// explicitly copying the method works
//a.myFunc = b.myFunc;

a.myFunc();

【讨论】:

    猜你喜欢
    • 2019-08-03
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2015-05-31
    • 2014-04-14
    相关资源
    最近更新 更多