перехватывает JavaScript-предупреждение () ..? это приемлемо? - PullRequest
1 голос
/ 19 января 2010

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

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

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

, поэтому каждый раз, когда я вызываю 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: объект не поддерживает это действие .

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

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

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

ОБНОВЛЕНИЕ:

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

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

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

Ответы [ 3 ]

3 голосов
/ 19 января 2010

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

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

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


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

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

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

0 голосов
/ 19 января 2010

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

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

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

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

0 голосов
/ 19 января 2010

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

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

...