Я пытаюсь выполнить горячую перезагрузку кода с помощью классов 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 вызывает оригинальный конструктор.
Что происходит и как я могу это исправить?