В моем Webapp мне нужно реализовать API, который не содержит определений классов ES6, но я хотел бы расширить один из этих классов и переопределить некоторые методы. Переопределение не работает должным образом ...
function A() {
this.msg = function() {
console.info("A");
}
}
class B {
constructor() {
A.call(this);
}
msg() {
console.info("B");
}
}
new B().msg();Я ожидаю, что результатом будет "B", но метод "класса" A будет выполнен.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема в том, что в A функция msg прикреплена к thisв конструкторе - то есть свойство msg прикреплено непосредственно к самому объекту экземпляра, а не на прототипе. Напротив, msgB находится в прототипB, то есть B.prototype, объект, от которого наследуется экземпляр.
Один из вариантов - перезаписать msg в конструкторе B:
function A() {
this.msg = function() {
console.info("A");
}
}
class B {
constructor() {
A.call(this);
this.msg = () => {
console.info('b');
}
}
}
new B().msg();Более красивым прототипом будет B, расширяющий A, если это возможная модификация, которую вы можете сделать:
function A() {
// empty constructor
}
A.prototype.msg = function() {
console.info("A");
}
class B extends A {
msg() {
console.info('b');
}
}
new B().msg();(при этом внутренняя цепочка прототипов выглядит так: A.prototype -> B.prototype -> instance, поэтому из экземпляра B.prototype.msg имеет приоритет над A.prototype.msg)
К сожалению, я не могу изменить определения классов / конструктор api-классов. Так что волей-неволей обходным путем должно быть определение в конструкторе ...