1

我刚刚发现我们可以在实际执行之前拦截 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 运行时错误:对象不支持此操作

我不知道这个.alert = alertHook; 让我拦截电话,但 alert=alertHook; 不是。??

所以我假设使用它来拦截任何本机 js 方法。?那正确吗?

这是可以接受的吗?因为这样我可以用我自己的方法完全替换任何本机 JS 调用??

更新:

我问这样可以接受吗?因为这是一个拥有 eval() 并让用户替换本机函数调用的好方法?

并且它保护开发人员免受误导性功能的语言的责任,在窗口级别(或在公共框架 js 文件中)替换本机 js 调用会使整个系统崩溃.. 不是吗?

我认为我可能错了,因为我不明白这个功能背后的原因..?我从来没有见过一种语言可以让开发人员替换自己的实现..

4

3 回答 3

3

根据Test();调用方式,this应该是windowObject。

我相信微软只允许通过指定窗口对象来覆盖原生 JS 函数。

所以window.alert = alertHook;应该在任何地方工作。


可以接受吗?

是的。这是语言灵活性的主要优势,尽管我确信有更好的选择而不是覆盖原生行为。

覆盖原生 JavaScript 函数并不是真正的安全问题。如果您正在运行其他人的代码,它可能是一个;但是,如果您正在运行其他人的代码,那么您应该关注许多其他安全问题。

于 2010-01-19T13:07:03.753 回答
0

在我看来,重新定义原生函数从来都不是好的做法。最好使用包装器(例如,创建一个debug函数,将其输出定向到alertconsole.log忽略调用或任何适合您需要的方法)。

至于为什么 JScript 在您的第二个示例而不是第一个示例中引发异常,这很容易。在第一个示例中,您创建了一个alert在本地范围内调用的属性,因此当您引用时,alert您将引用this.alert而不是window.alert. 在第二个示例中,alert您引用的是 from window,因此为其分配不同的函数将失败。

于 2010-01-19T13:17:07.500 回答
0

并且它保护开发人员免受误导性功能的语言的责任,在窗口级别(或在公共框架 js 文件中)替换本机 js 调用会使整个系统崩溃.. 不是吗?

不正确,替换本机调用仅钩入它,替换它:它根本不重写本机。破坏“整个”系统;JavaScript 在虚拟机中运行,它被解释,因此崩溃“整个”系统(即蓝屏死机?)的可能性非常小。如果是这样:这不是程序员的错,而是导致错误的 JavaScript 的实现。

您可以将其视为一项功能:例如,如果您从别人的手中加载 JavaScript,您可以重新实现一些功能以进行扩展。

对程序员的保护就像是拴着狗:只有当你信任狗时才释放它!由于 JavaScript 在虚拟机中运行,任何程序员都可以被释放——如果实现足够安全,它就是(大多数时候?)

于 2010-01-19T13:45:43.273 回答