Как в 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());

→ Ссылка