我正在尝试创建一个dom元素的代理,在这个例子中我使用了window对象。当我运行代码时,我得到了一个:
Uncaught TypeError: Illegal invocation
但是,如果我修改:return Reflect.apply(method, this, arguments);
用:return Reflect.apply(method, target, arguments);
一切正常。如果我从像alice这样的自定义对象创建代理,两个版本都可以正常工作。
在创建dom对象的代理时,有没有办法使用return Reflect.apply(method, this, arguments);
?为什么不起作用?
<html>
<head>
</head>
<body>
hello
<script>
var alice = {
firstname:'Alice',
lastname:'Smith',
secret:'secret',
amount: 0,
removeAmount : function(amount){
this.amount = this.amount - amount;
},
};
var handler = {
get: function(target, name, receiver){
console.log("get: "+ name);
var method = Reflect.get(target, name, receiver);
if (typeof method === "function"){
return function () {
return Reflect.apply(method, this, arguments);
}
}
return method;
},
set: function(target, name, value, receiver){
console.log("set: "+ name);
return Reflect.set(target, name, value, receiver);
}
};
var p = new Proxy(window,handler);
p.alert("http://www.w3schools.com");
</script>
</body>
</html>
答案 0 :(得分:0)
在这种情况下,您希望通过window.alert
实例(另一个上下文)调用Proxy
(窗口上下文),因此您应将window
显式设置为上下文作为第二个参数{ {1}}。因为在此代码执行时,Reflect.Apply(method, window, arguments)
不再引用this
。