Я реализовал модуль JS, который я использую из нескольких скриптов Node.js.
Я хотел бы иметь возможность использовать этот модуль также из браузера, и я хотел бы, чтобы все сообщения отображались вокно оповещения HTML вместо терминала.
В идеале я хотел бы добиться этого, не меняя мой модуль JS (например, заменяя все вхождения console.log
на alert
или передаваяфункция регистрации при инициализации модуля).
Итак, я решил, что могу просто установить console.log = alert
прямо перед тем, как использовать этот модуль из имеющегося у меня кода на стороне клиента.
Длявсе это имеет значение, на самом деле я делаю это с Electron (кроссплатформенные настольные приложения, использующие JavaScript), но я также проверил это в браузере, и результат тот же.
С console.log = alert
я успешно изменяю console.log
с function log() {[native code]}
на function alert() {[native code]}
.
Однако, когда я пытаюсь вызвать console.log("test")
, я получаю исключение TypeError: Illegal invocation
.
Вот простая клиентская сторонакод, который воспроизводит эту проблему:
<!DOCTYPE html>
<html>
<body>
<script type="text/javascript">
try{
alert(`before:\n- alert = ${alert}\n- console.log = ${console.log}`);
console.log = alert;
alert(`after:\n- alert = ${alert}\n- console.log = ${console.log}`);
console.log("test");
}
catch (error) {
alert(error);
}
</script>
</body>
</html>
Может кто-нибудь сказать, почему я получаю эту проблему, и как я могу решить ее (в идеале, не меняя мой модуль JS)?
Возможно ли эточто alert
в конце концов вызывает console.log
, что приводит к некоторой бесконечной рекурсии?
Спасибо!