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

使用javascript代理拦截方法调用时进行非法调用,javascript,javascript-objects,es6-proxy,Javascript,Javascript Objects,Es6 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(

有人能解释一下下面的输出吗

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

第一条语句抛出非法调用错误,而第二条语句则没有。这两条语句在我看来都是一样的,我不明白为什么第一条语句在
反射期间没有所需的
上下文。apply

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

var obj={};

警报。呼叫(obj,“你好!”);//不行
有关@ibrahimmahrir应用于您的代理的答案,请参阅
alert.call(新代理(窗口,{}),“alert”)
产生的错误当在没有显式上下文的情况下调用函数时,上下文将为
window
。显式上下文:在
obj.func
func.call(obj)
中,上下文都是
obj
@Ry-感谢这个精彩的例子,它实际上回答了这个问题。因此,将目标的代理对象作为上下文传递与将目标本身作为上下文传递并不相同,这实际上是有意义的。谢谢,我会将此标记为答案,但此处代理变得相关的原因是,如果我在get处理程序内调用Reflect.apply,则此问题不再发生,因为现在我正在调用捕获了目标上下文的方法。