javascript – 为什么ES2015中的Map对象的Proxy无法正常工作
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 为什么ES2015中的Map对象的Proxy无法正常工作,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3289字,纯文字阅读大概需要5分钟。
内容图文
![javascript – 为什么ES2015中的Map对象的Proxy无法正常工作](/upload/InfoBanner/zyjiaocheng/714/b62634213e2c4c95acacca856bc15373.jpg)
我通过Google Chrome版本57.0.2987.133运行以下脚本:
var loggingProxyHandler = {
"get" : function(targetObj, propName, receiverProxy) {
let ret = Reflect.get(targetObj, propName, receiverProxy);
console.log("get("+propName.toString()+"="+ret+")");
return ret;
},
"set" : function(targetObj, propName, propValue, receiverProxy) {
console.log("set("+propName.toString()+"="+propValue+")");
return Reflect.set(targetObj, propName, propValue, receiverProxy);
}
};
function onRunTest()
{
let m1 = new Map();
let p1 = new Proxy(m1, loggingProxyHandler);
p1.set("a", "aval"); // Exception thrown from here
}
onRunTest();
NOTE: Requires a browser supporting ES2015's Proxy
运行时,我看到调用处理程序的get陷阱来返回Map的set函数
然后我收到以下错误:
"Uncaught TypeError: Method Map.prototype.set called on incompatible receiver [object Object]"
at Proxy.set (native)
...
我尝试从loggingProxyHandler中删除陷阱函数(使其成为空对象),但仍然收到相同的错误.
我的理解是,应该能够为所有本机ES5和ES2015 javascript对象生成Proxy对象.数组似乎在相同的代理处理程序下运行良好.
我误解了规格吗?
我的代码遗漏了什么吗?
Chrome中是否存在已知错误? (我进行了搜索,发现此主题没有Chrome的缺陷.)
解决方法:
您收到错误的原因是代理没有参与p1.set调用(除了设置陷阱 – 无关,尽管名称相同 – 正在调用以检索函数引用).因此,一旦检索到函数引用,就会使用此set调用代理,而不是Map – Map不喜欢.
如果您真的试图拦截Map上的所有属性访问调用,您可以通过绑定从get返回的任何函数引用来修复它(请参阅***行):
var loggingProxyHandler = {
"get" : function(targetObj, propName, receiverProxy) {
let ret = Reflect.get(targetObj, propName, receiverProxy);
console.log("get("+propName.toString()+"="+ret+")");
if (typeof ret === "function") { // ***
ret = ret.bind(targetObj); // ***
} // ***
return ret;
},
"set" : function(targetObj, propName, propValue, receiverProxy) {
console.log("set("+propName.toString()+"="+propValue+")");
return Reflect.set(targetObj, propName, propValue, receiverProxy);
}
};
function onRunTest()
{
let m1 = new Map();
let p1 = new Proxy(m1, loggingProxyHandler);
p1.set("a", "aval");
console.log(p1.get("a")); // "aval"
}
onRunTest();
NOTE: Requires a browser supporting ES2015's Proxy
但是,如果您的目标只是截取Map#get和Map#set,则根本不需要代理.或者:
>创建一个Map子类并实例化它.但是,假设您控制了Map实例的创建.
>创建一个从Map实例继承的新对象,并覆盖get和set;你不必控制原始地图的创作.
>使用您自己的版本替换Map实例上的set和get方法.
这是#1:
class MyMap extends Map {
set(...args) {
console.log("set called");
return super.set(...args);
}
get(...args) {
console.log("get called");
return super.get(...args);
}
}
const m1 = new MyMap();
m1.set("a", "aval");
console.log(m1.get("a"));
#2:
const m1 = new Map();
const p1 = Object.create(m1, {
set: {
value: function(...args) {
console.log("set called");
return m1.set(...args);
}
},
get: {
value: function(...args) {
console.log("get called");
return m1.get(...args);
}
}
});
p1.set("a", "aval");
console.log(p1.get("a"));
#3:
const m1 = new Map();
const m1set = m1.set; // Yes, we know these are `Map.prototype.set` and
const m1get = m1.get; // `get`, but in the generic case, we don't necessarily
m1.set = function(...args) {
console.log("set called");
return m1set.apply(m1, args);
};
m1.get = function(...args) {
console.log("get called");
return m1get.apply(m1, args);
}
m1.set("a", "aval");
console.log(m1.get("a"));
内容总结
以上是互联网集市为您收集整理的javascript – 为什么ES2015中的Map对象的Proxy无法正常工作全部内容,希望文章能够帮你解决javascript – 为什么ES2015中的Map对象的Proxy无法正常工作所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。