перехват javascript alert()..? это приемлемо?

Я только что обнаружил, что мы можем перехватить собственный вызов javascript alert() и перехватить пользовательский код до фактического выполнения. посмотрите пример кода..

  function Test(){
    var alertHook=function(aa){
     this.alert(aa);
    }

    this.alert("aa");
       this.alert = alertHook;
    alert("aa");
  }

поэтому каждый раз, когда я вызываю предупреждение («аа»), оно перехватывается моей локальной функцией alertHook. Но приведенная ниже реализация с небольшим изменением не работает.

  function Test(){
    var alertHook=function(aa){
     alert(aa);
    }

    alert("aa");
       alert = alertHook;  //throws Microsoft JScript runtime error: Object doesn't support this action
    alert("aa");
  } 

выдает ошибку выполнения Microsoft JScript: объект не поддерживает это действие.

Я не знаю, как это.alert = alertHook; позволь мне перехватить звонок, но alert=alertHook; нет.??

Итак, я предполагаю, что использую это для перехвата любых собственных методов js.? это правильно?

И это приемлемо? потому что таким образом я могу полностью заменить любые собственные вызовы JS своими собственными методами ??

ОБНОВЛЕНИЕ:

Я спросил, это приемлемо? потому что, как это хороший подход с eval() и предоставлением пользователям возможности заменить собственные вызовы функций?

И его обязанность языка защищать разработчиков от вводящих в заблуждение функций, замена собственных вызовов js на уровне окна (или в общем js-файле фреймворка) приведет к сбою всей системы ... не так ли ??

я могу ошибаться, потому что я не понимаю причину этой функции ..? Я никогда не видел языка, который позволял бы разработчику заменить свою собственную реализацию.


person RameshVel    schedule 19.01.2010    source источник
comment
Я не согласен с тем, что язык должен защищать разработчиков от вводящих в заблуждение функций. Скорее, я думаю, что разработчики должны знать и понимать свои инструменты. Достаточно ли хорошо вы понимаете эту функцию, чтобы написать пример, который заменяет нативные вызовы js таким образом, чтобы привести к сбою всей системы? Возможно, было бы целесообразно развить ваше понимание этого инструмента (и этой функции в частности) до такой степени, что вы будете знать, является ли ваше беспокойство законным, прежде чем прийти к выводу, к которому вы уже пришли.   -  person Greg D    schedule 19.01.2010


Ответы (3)


В зависимости от того, как вызывается Test();, this должен быть объектом window.

Я считаю, что Microsoft разрешает перезаписывать собственные функции JS только путем указания объекта окна.

Так что window.alert = alertHook; должен работать где угодно.


это приемлемо?

Да, это так. Это главная сила гибкости языка, хотя я уверен, что есть лучшие альтернативы вместо того, чтобы перезаписывать нативное поведение.

Перезапись нативных функций JavaScript на самом деле не является проблемой безопасности. Это может быть один, если вы запускаете чужой код, который делает это; но если вы запускаете чужой код, вам следует беспокоиться о многих других проблемах безопасности.

person Luca Matteis    schedule 19.01.2010
comment
о, тогда это возможно только в IE?? - person RameshVel; 19.01.2010
comment
нет, можно везде. Но IE просто выдает ошибку, если вы не укажете объект окна. - person Luca Matteis; 19.01.2010
comment
спасибо Лука, но это действительно приемлемо?? Благодаря этому небольшому изменению я мог перехватывать любые нативные вызовы JS. Как язык позволит мне перехватывать его собственные методы?? разве это не открывает нежелательные проблемы с безопасностью? - person RameshVel; 19.01.2010
comment
@Ramesh: он работает на клиенте, поэтому серверу ничего не угрожает. Он работает в песочнице и не вызывает внешний код, а вызывает ваш код. Пожалуйста, приведите пример проблемы безопасности. - person Greg D; 19.01.2010

На мой взгляд, никогда не рекомендуется переопределять нативные функции. Лучше использовать обертки (например, создать функцию debug, которая направляет свой вывод на alert или console.log или игнорирует вызовы или что-то еще, что вам нужно).

Что касается того, почему JScript выдает исключение во втором примере, а не в первом, это просто. В первом примере вы создаете свойство с именем alert в своей локальной области, поэтому, когда вы ссылаетесь на alert, вы будете ссылаться на this.alert, а не на window.alert. Во втором примере alert, на который вы ссылаетесь, принадлежит window, поэтому присвоение ему другой функции не удастся.

person Miguel Ventura    schedule 19.01.2010
comment
-1. Предполагая, что Test(); вызывается нормально, в его первом примере this.alert и window.alert совпадают. И во втором примере причина сбоя не в этом. - person Luca Matteis; 19.01.2010

И его обязанность языка защищать разработчиков от вводящих в заблуждение функций, замена собственных вызовов js на уровне окна (или в общем js-файле фреймворка) приведет к сбою всей системы ... не так ли ??

Неправда, замена нативного звонка только его цепляет, заменяет: совсем не переписывает родной. Сбой «всей» системы; JavaScript работает в виртуальной машине, он интерпретируется, поэтому вероятность сбоя «всей» системы (т.е. «Синего экрана смерти»?) очень мала. Если это так: это не вина программистов, а реализация JavaScript, которая вызывает ошибку.

Вы можете рассматривать это как функцию: например, если вы загружаете JavaScript из чужой руки, вы можете переопределить некоторые функции для расширения.

Защита для программиста — это как держать собаку на поводке: отпускайте ее только тогда, когда вы доверяете собаке! Поскольку JavaScript работает на виртуальной машине, любой программист может быть развязан — если реализация достаточно безопасна, а это (в большинстве случаев?)

person Pindatjuh    schedule 19.01.2010
comment
системный сбой (т.е. синий экран смерти?).. я не имел в виду это.. сбой приложения, что я имею в виду... :( - person RameshVel; 19.01.2010