Я пытаюсь перезагрузить горячий код с помощью классов ES6. Мне нужно иметь возможность изменять конструктор классов, не заменяя класс новым (потому что другие люди могут иметь на него ссылку).
Однако я обнаружил, что похоже, что объект класса имеет некоторую внутреннюю ссылку на конструктор, с которым он был изначально определен; создание экземпляра класса с new
не выполняет поиск ни constructor
, ни prototype.constructor
в классе.
Пример:
class OldC { constructor() { console.log("old"); } }
class NewC { constructor() { console.log("new"); } }
OldC.prototype.constructor = NewC.prototype.constructor;
OldC.constructor = NewC.constructor;
new OldC();
---> "старый"
(Обновление всех других методов работает нормально; это просто конструктор, с которым у меня проблемы.)
Думая, что конструктор может быть найден через [[prototype]]
, я также добавил это:
Object.setPrototypeOf(OldC, Object.getPrototypeOf(NewC));
Object.setPrototypeOf(OldC.prototype, Object.getPrototypeOf(NewC.prototype));
Это тоже не помогает (и я бы не ожидал, что это произойдет, учитывая, что подклассы не происходят).
После всего этого проверка OldC показывает, что свойства прототипа в точности такие, как я ожидал, а OldC.prototype.constructor
является новым. Но все же создание экземпляра OldC вызывает исходный конструктор.
Что происходит, и как это исправить?
OldObject
в вашем примере? создание экземпляра класса с помощьюnew
не выполняет поиск ниconstructor
, ниprototype.constructor
в классе. Нет, потому что вы используетеnew
для объекта функции, а вызывается сам объект функции. - person Felix Kling   schedule 19.03.2019.constructor
обоих классовFunction
. - person ziggy wiggy   schedule 19.03.2019