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

标签 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(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

关于javascript - 使用javascript代理拦截方法调用时进行非法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51957401/

相关文章:

javascript - 基本 Flash 问题 - 在电影结束时调用 javascript 函数

javascript - 如何使用 React Native 将cameraRoll asset uri保存到cloudinary?

javascript - 使用带有普通数组的代理

javascript - 为什么 'await' 在 '.then()' 函数返回的代理上触发 'async'?

javascript - ES6 Proxy 记录了无法解释的额外值

javascript - 我的代码中存在 "this.function"和 Scope 问题

javascript - 忽略 JSHint 中的驼峰变量

javascript - 如何限制通过ajax发布的JS对象

javascript - 检查对象的递归方法

javascript - 计算数组中多个对象的属性