Как скопировать свойства одного класса в другой в javascript, включая методы

У меня есть два класса 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();

Вопрос в следующем: есть ли способ скопировать все методы, не делая это явно?

Мне интересно, какой вариант использования для этого?

BlueWater86 23.12.2020 02:07

У меня есть объект, который обрабатывает встречи для клиента и всех его клиентов вместе со всей логикой, связанной с возникновением различных событий (например, созданием новой встречи). Затем у меня есть еще один объект, который генерирует сообщения, когда происходят разные события, и отправляет их своим клиентам. Вместе они создают систему сообщений. Но только объект сообщения используется для создания предустановленных сообщений и позволяет клиентам изменять свои сообщения. И логический объект также независим, так что его можно расширить другим объектом, например. для отправки пакетов вместо отправки сообщений.

Jens Modvig 23.12.2020 02:14

Похоже, что лучшим подходом может быть экспорт логики в виде модуля ES6 в стиле утилиты и использование ее в двух других классах. В долгосрочной перспективе наследование будет гораздо удобнее в сопровождении, чем копирование методов вручную.

BlueWater86 23.12.2020 02:17

Поэтому вместо myFunc() { console.info(this.name) } вы должны написать myFunc(customer) { console.info(customer.name) } в функции вне класса. Написание ваших служебных функций в специальном файле и их импорт с использованием модулей ES6 (как предложил BlueWater86) позволяет вам логически связать их вместе без необходимости иметь их в классе.

Rocky Sims 23.12.2020 02:27

Да, я мог бы сделать так, чтобы логический объект принимал другой «объект-исполнитель» в качестве параметра, который содержит функции, которые обновляются, когда логические объекты отправляют событие. Если это то, что предлагается? Трудно объяснить проблему.

Jens Modvig 23.12.2020 02:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
5
1 492
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете перебирать имена свойств прототипа 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();

Другие вопросы по теме