У меня есть два класса A и B, которые работают независимо друг от друга, но иногда я хочу создать их вместе, чтобы функции в A вызывали функции в B. Это легко сделать, расширив B из A и тем самым переопределив методы , это, однако, не позволяет мне создавать B независимо от A.
Вместо этого я хочу скопировать все свойства и методы. Я попытался использовать Object.assign
следующий пример иллюстрирует проблему.
class A {
myFunc() {
throw 'I have not been created yet'
}
}
class B {
myFunc() {
console.info(`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 в стиле утилиты и использование ее в двух других классах. В долгосрочной перспективе наследование будет гораздо удобнее в сопровождении, чем копирование методов вручную.
Поэтому вместо myFunc() { console.info(this.name) }
вы должны написать myFunc(customer) { console.info(customer.name) }
в функции вне класса. Написание ваших служебных функций в специальном файле и их импорт с использованием модулей ES6 (как предложил BlueWater86) позволяет вам логически связать их вместе без необходимости иметь их в классе.
Да, я мог бы сделать так, чтобы логический объект принимал другой «объект-исполнитель» в качестве параметра, который содержит функции, которые обновляются, когда логические объекты отправляют событие. Если это то, что предлагается? Трудно объяснить проблему.
Вы можете перебирать имена свойств прототипа B и назначать их экземпляру исключающего конструктора следующим образом:
class A {
myFunc() {
throw 'I have not been created yet'
}
}
class B {
myFunc() {
console.info(`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();
Мне интересно, какой вариант использования для этого?