gpt4 book ai didi

javascript - 谷歌浏览器是否有可用的代理对象 polyfill?

转载 作者:数据小太阳 更新时间:2023-10-29 04:12:43 26 4
gpt4 key购买 nike

这可能吗?其他浏览器怎么样?估计 es6 何时“准备好”并推出?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

顺便说一句。 https://github.com/tvcutsem/harmony-reflect代理不适用于当前的 chrome (36.0.n)

最佳答案

你可以使用 Object.definePropertyObject.observe来模拟代理。我开始想知道一个 polyfill 可以支持多少功能,所以我写了一个实现(你可以在 gist.github.com/mailmindlin/640e9d707ae3bd666d70 看到它)。我能够模拟 Proxy 的所有不依赖于运算符重载的功能,这在 JavaScript 中是不可能的。

但是,您可以使 getset 和其他一些方法正常工作。您可以使用 getter 和 setter 来镜像目标对象的属性:

for (var property in target)
Object.defineProperty(proxy, property, {
get: function() {
if ('get' in handler)
return handler.get(target, property, proxy);
else
return target[property];
},
set: function(value) {
if ('set' in handler)
handler.set(target, property, value, proxy);
else
target[property] = value;
}});

唯一的问题是 getter 和 setter 只适用于初始化代理时为目标定义的属性,delete 运算符将不起作用(如果您删除目标对象上的属性,代理仍会将其枚举为属性;如果删除代理上的属性,对象将不会发生任何事情。

要解决此问题,您可以使用 Object.observe,它会在任一对象发生任何更改时被调用。快速查看 caniuse.com显示 Object.observe 在 Chrome 和 Opera 上可用。如果您确实需要在其他浏览器上支持 Proxy,您可以轮询 targetproxy 对象,以检查是否已创建或销毁任何属性:

var oldKeys = Object.keys(proxy);
setInterval(function() {
var keys = Object.keys(proxy);
for(var i in keys)
if(!oldKeys.includes(keys[i]))
//Trigger code for a new property added

for(var i in oldKeys)
if(!keys.includes(oldKeys[i]))
//trigger code for a deleted property

oldKeys = keys;

//repeat for target object
}, 100);

如果您迫切需要代理的更多功能,您可以尝试重写方法,例如 Object.definePropertyObject.getOwnPropertyDescriptor,但这可能会产生与其他方法的兼容性问题脚本,具体取决于您的操作方式。

简而言之,您可以使用 polyfill 完成您可能需要使用 Proxy 完成的大部分工作。至于谷歌将其添加到他们的浏览器,我不知道。据我所知,它显然曾经是 V8 引擎的一部分,但由于安全问题(没有人详细说明)而被删除了 this thread .

关于javascript - 谷歌浏览器是否有可用的代理对象 polyfill?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24907229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com