Как в javascript сделать примесь из другого класса?
В JavaScript можно сделать примесь из объекта в класс.
Для примера:
const testObject = {
test() {
return 1;
},
}
class MUST_BE_HOCKED {
test() {
return 33;
}
}
Object.assign(MUST_BE_HOCKED.prototype, testObject)
const a = new MUST_BE_HOCKED()
console.log(a.test()); //1
А как примешать методы класса, или это уже множественное наследование?
Для примера:
class testClass {
arama(a) {
return 1
}
brama() {
return 2
}
}
Object.assign(MUST_BE_HOCKED.prototype, testClass.prototype) //Не работает.
Ответы (1 шт):
Автор решения: Grundy
→ Ссылка
Object.assign проходится только по перечислимым свойствам объекта.
Методы описанные в теле класса, добавляются в его прототип, как не перечислимые, поэтому с помощью Object.assign напрямую нельзя добавить методы из прототипа класса.
Однако, можно получить все свойства объекта с помощью Object.getOwnPropertyDescriptors, собрать из полученного списка объект и далее использовать Object.assign, например так:
class MUST_BE_HOCKED {
test() {
return 33;
}
}
class testClass {
arama(a) {
return 1
}
brama() {
return 2
}
}
const mixProps = Object.fromEntries(Object.entries(Object.getOwnPropertyDescriptors(testClass.prototype))
.filter((descriptor) => descriptor[0] !== 'constructor') // удаляем конструктор
.map(([name, descriptor]) => [name, descriptor.value])) // оставляем только значения свойств
Object.assign(MUST_BE_HOCKED.prototype, mixProps) //Не работает.
const a = new MUST_BE_HOCKED();
console.log(a.arama());