Почему возникает ошибка?
Поскольку метод W.prototype.f
, использующий super
, заботится только о прототипе W.prototype
, чтобы оценить, что будет означать super
,Ключевое слово super
по сути является статическим поиском, в зависимости от объекта, в котором был объявлен метод, игнорируя цепочку прототипов объекта, для которого был вызван метод.
Если мы translate to
class W {
f() {
console.log('f (new)');
Object.getPrototypeOf(W.prototype).f.call(this); // TypeError: (intermediate value).f is not a function
console.log(this.p);
}
}
мы можем видеть, что Object.prototype.f
не является функцией ...
Таким образом, вы можете решить проблему, выполнив Object.setPrototypeOf(W.prototype, C.prototype)
вместо Object.setPrototypeOf(w, c)
(илиw = Object.create(c, …)
), но я не могу этого рекомендовать.Если бы вы действительно хотели повлиять на все экземпляры, вы бы уже написали class W extends C
(что привело бы к тому же результату, что и при использовании Object.setPrototypeOf(W.prototype, C.prototype)
).