【发布时间】: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