Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript google chrome是否有可用的代理对象polyfill?_Javascript_Google Chrome_Proxy_Polyfills - Fatal编程技术网

Javascript google chrome是否有可用的代理对象polyfill?

Javascript google chrome是否有可用的代理对象polyfill?,javascript,google-chrome,proxy,polyfills,Javascript,Google Chrome,Proxy,Polyfills,这可能吗?其他浏览器呢?对es6何时“准备就绪”并推出有何估计 顺便说一句,Proxy不适用于当前的chrome(36.0.n)更新:虽然我的答案提供了部分解决方案,但mailmindlin的答案证明我的主要观点是错误的:你可以为Proxy创建一个多边形填充 不,你不能。由于代理依赖于几种语言语法元素的特殊(新)行为,即运算符和[索引]运算符,因此它不能由polyfill模拟 唯一的方法是更改您使用的语法。例如,如果希望通过代理将所有字符串属性大写,可以创建如下“代理”对象: var obje

这可能吗?其他浏览器呢?对es6何时“准备就绪”并推出有何估计


顺便说一句,Proxy不适用于当前的chrome(36.0.n)

更新:虽然我的答案提供了部分解决方案,但mailmindlin的答案证明我的主要观点是错误的:你可以为Proxy创建一个多边形填充

不,你不能。由于代理依赖于几种语言语法元素的特殊(新)行为,即
运算符和
[
索引
]
运算符,因此它不能由polyfill模拟

唯一的方法是更改您使用的语法。例如,如果希望通过代理将所有字符串属性大写,可以创建如下“代理”对象:

var object = ...
var proxy = {
    get: function proxyGet(key) {
        var res = object[key];
        if (typeof res === "string") {
            res = res.toUpperCase();
        }
        return res;
     }
}
但是,你仍然需要用不同的方式来称呼它:

proxy.get("myVar");
而不是

object.myVar;

这就是新代理语法所支持的


注意:通过枚举对象的函数属性,并为每个属性在代理对象上创建代理函数,几乎可以创建仅适用于方法的多边形填充;但是,这不适用于非函数属性,因为您无法动态影响它们的访问方式。

您可以使用和来模拟代理。我开始想知道polyfill可以支持多少功能,所以我写了一个实现(您可以在上看到)。 我能够模拟代理的所有特性,这些特性不依赖于操作符重载,而这在JavaScript中是不可能的

但是,您可以使用
get
set
,以及其他一些功能。可以使用getter和setter镜像目标对象的属性:

for(目标中的var属性)
Object.defineProperty(代理、属性、{
get:function(){
if('get'在处理程序中)
return handler.get(目标、属性、代理);
其他的
返回目标[属性];
},
设置:函数(值){
if(处理程序中的“set”)
set(目标、属性、值、代理);
其他的
目标[财产]=价值;
}});
唯一的问题是,getter和setter只应用于初始化代理时在中为目标定义的属性,
delete
操作符将不起作用(如果删除目标对象上的属性,代理仍会将其枚举为属性;如果删除代理上的属性,则对象不会发生任何变化)

若要解决此问题,您可以使用
Object.observe
,它将在对任一对象进行任何更改时调用。快速检查将显示该Object.observe在Chrome和Opera上可用。如果您确实需要在另一个浏览器上支持代理,您可以轮询
目标
代理
对象,以检查是否有任何属性被删除创建或销毁:

var oldKeys=Object.keys(代理);
setInterval(函数(){
var-keys=Object.keys(代理);
for(键中的变量i)
如果(!oldKeys.includes(键[i]))
//已添加新属性的触发器代码
用于(旧键中的变量i)
如果(!keys.includes(oldKeys[i]))
//已删除属性的触发器代码
旧钥匙=钥匙;
//对目标对象重复此操作
}, 100);
如果您迫切需要代理的更多功能,您可以尝试重写方法,例如
Object.defineProperty
Object.getOwnPropertyDescriptor
,但这可能会造成与其他脚本的兼容性问题,具体取决于您的操作方式


简言之,你可以用polyfill做你可能需要使用代理的大部分事情。至于谷歌将其添加到他们的浏览器中,我不知道。它显然曾经是V8引擎的一部分,但由于安全问题被删除了(没有人详细说明),据我所知。

我创建了babel插件,该插件允许您执行此操作,但它会对性能产生巨大影响(对于每个属性访问)-这是一个更具教育意义的示例


以下是谷歌Chrome团队创建的一个:


不过,这并不是一个完整的实现。

您可能还可以控制对已定义的非函数属性的访问,以设置getter和setter。如果我理解正确,这允许定义在后台工作的访问器方法,允许使用通常的“点”access语法?这意味着我完全错了。你为什么不把你的评论扩展成一个答案呢?我会发现它非常有用,OP@mailmindlin也一样。谢谢你发布你的答案!我期待着看到你将来对的贡献!不幸的是,Object.observer似乎没有被太多使用,所以它被不推荐用于Chrome and Opera.caniuse.com/#search=Proxy显示,截至2016年8月,Proxy可用于所有主要浏览器(56.54%的全球用户),而Object.observe仅可用于8.01%(和下降)。
proxy.myVar