繁体   English   中英

使用javascript代理拦截方法调用时非法调用

[英]Illegal invocation while intercepting method calls with javascript proxy

有人可以解释以下输出吗

var handler = {
  get: function(target,key, receiver){
    return new Proxy(Reflect.get(target, key, receiver),handler);
  }, 
  apply: function(target, thisArg, args){
    Reflect.apply(target, thisArg, args);
  }
}

var p = new Proxy(window, handler);
p.alert("Alert"); // Throws illegal invocation error

var alias = p.alert;
alias("Alert") // Even this works which is baffling for me

var p = new Proxy(Reflect.get(window, "alert"), handler);
p("Alert"); // works as expected

第一条语句抛出非法调用错误,而第二条则不会。 他们两个对我来说看起来都一样,我不明白第一条语句在Reflect.apply期间如何没有所需的this上下文

只是alert需要window作为上下文,否则会引发该错误。 它与代理无关。 这两个示例抛出相同的错误:

 var obj = {}; alert.call(obj, "hello!"); // doesn't work!

和:

 var obj = { alert: alert }; obj.alert("hello!"); // doesn't work!

在您的代码中,如果您将p.alert的上下文设置为window ,它会起作用:

p.alert.call(window, "hello!");      // works!

 var handler = { get: function(target, key, receiver) { return new Proxy(Reflect.get(target, key, receiver), handler); }, apply: function(target, thisArg, args) { Reflect.apply(target, thisArg, args); } } var p = new Proxy(window, handler); p.alert.call(window, "Alert");

代码中的另外两个示例可以工作,因为上下文是window

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM