大家好,今天小编来为大家解答以下的问题,关于深入解析ES6中的Proxy与Reflect:掌握JavaScript高级特性,这个很多人还不知道,现在让我们一起来看看吧!
a===1 a===2 a===3 我的总体思路是定义变量a=0,每次获取值时,先使用a++,然后返回。
ok 要在完成值获取之前拦截一个步骤并输出我们想要的值,我们需要使用es5中的数据劫持。
于是我点击并编写了以下代码:
窗口["a"]=0;
Object.defineProperty(窗口,"a",{
得到() {
窗口["a"]++
返回窗口["a"]
}
})然后就报错了。错误的原因是堆栈溢出。
我想了想,原来是当我取a的值的时候,我的操作就被劫持了。这时候我用了a++,相当于把a的值拿了一遍,又劫持了一次,于是就陷入了死循环。
所以我觉得改成一个不会被劫持的还是值得的,所以我写了下面的代码:
让计数=0;
Object.defineProperty(窗口,"a",{
得到() {
计数++;
返回计数;
}
})结果确实是正确的。
上面代码两端使用了Object.defineProperty。
官方解释:Object.defineProperty()方法会直接在一个对象上定义一个新的属性,或者修改一个对象已有的属性,并返回该对象。
它可以定义一个新的属性,比如上面的a,这个属性原本不存在,但是被程序定义了。
或者修改一个现有的属性,比如第一个程序中的window["a"],它已经存在了。
OK,据说Vue2.x中数据的双向绑定就用了这个东西。
如果想详细了解双向数据绑定的实现,请阅读文章:http://www.cnblogs.com/libin-1/p/6893712.html
接着说Proxy
Proxy表面上与defineProperty类似。如果后者可以实现,那么前者也可以实现,比如监控对象中某个属性的变化。
让obj=新代理({a:1},{
获取(目标,p,接收者){
控制台.log("值")
},
设置(目标,p,值,接收器){
console.log("改变值")
}
})与defineProperty相比,Proxy有以下优点:
监听对象中所有属性时,不需要遍历,而defineProperty则需要遍历。支持数组不需要遍历键。这解决了Object.defineProperty() 的第二个问题。 Proxy 是针对整个obj 的。因此,obj中包含的所有键都可以输入到集合中。 (保存一次Object.keys()的遍历)Proxy支持的拦截方法请参考官方文档:
http://es6.ruanyifeng.com/#docs/proxy#Proxy-%E5%AE%9E%E4%BE%8B%E7%9A%84%E6%96%B9%E6%B3%95
Reflect对象
与之前的代码相同
让obj=新代理({a:1},{
获取(目标,p,接收者){
控制台.log("值")
}
})
let a=obj.a 我立即输出a,但结果是未定义的。为什么?因为get方法只是拦截、监听,但方法并没有返回。
我按照官方教程输出了返回值。代码如下:
让obj=新代理({a:1},{
获取(目标,p,接收者){
返回Reflect.get(目标,p,接收者)
}
})
let a=obj.a 获取obj.a 的值。
那么什么是反射呢?
官方解释:为操作对象提供了新的API
http://es6.ruanyifeng.com/#docs/reflect
反射的优点
1. 将Object对象的语言内部方法放在Reflect对象上,即从Reflect对象中取出Object对象的内部方法。
让obj={a:1};
//老的
Object.defineProperty();
//新的
Reflect.deleteProperty() 将使用旧的Object 方法报告错误并返回false //old
尝试{
Object.defineProperty(目标、属性、属性);
//成功
} 捕获(e) {
//失败
}//新的
if (Reflect.defineProperty(目标、属性、属性)) {
//成功
} 别的{
//失败
} 让对象操作变成函数行为//老了
对象中的“名称”//新
Proxy 上的Reflect.has(Object,"name") 方法必须在Reflect 上可用。 Proxy修改默认行为后,可以使用Reflect来保证默认行为正常运行。让obj=新代理({a:1},{
获取(目标,p,接收者){
//更改默认文本
控制台.log("值")
//使默认行为正常执行
返回Reflect.get(目标,p,接收者)
}
})
让a=obj.a
深入解析ES6中的Proxy与Reflect:掌握JavaScript高级特性和的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!
【深入解析ES6中的Proxy与Reflect:掌握JavaScript高级特性】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于明白这两种神奇的东西在JS里的作用了!
有12位网友表示赞同!
平时用的很少,现在来看还挺有意思的,感觉可以拿来写一些高级的代码。
有8位网友表示赞同!
Proxy 和 Reflect 对 JavaScript 的掌握又提升了一个level。
有18位网友表示赞同!
这个 ES6 新特性一直想学习一下,有机会得好好看看代理和反射的使用场景。
有14位网友表示赞同!
之前对这两个名词没啥概念,看标题感觉应该是个很实用的东西。
有12位网友表示赞同!
这篇文章的解读能让我更好地理解 Proxy 和 Reflect 的本质?
有14位网友表示赞同!
看了这篇文章我可能可以尝试用它们优化代码效率呢?
有6位网友表示赞同!
感觉学习 ES6 就意味着要接触到这两个新特性,很期待这篇深入讲解!
有20位网友表示赞同!
代理和反射听起来还是很有特色的啊,希望能有清晰的例子来演示。
有19位网友表示赞同!
我平时写 JavaScript 时很少用到 Proxy 和 Reflect,这篇文章应该能帮到我!
有19位网友表示赞同!
感觉这个 Proxy 可以用来解决一些操作对象的特殊需求?
有13位网友表示赞同!
希望这篇文章能够把这两个特性讲清楚,让我更容易理解。
有11位网友表示赞同!
终于有时间学习 ES6 中的这些新知识,期待这篇深入浅出的讲解!
有15位网友表示赞同!
想写一些更高级的JavaScript代码,Proxy 和 Reflect 应该很关键!
有8位网友表示赞同!
看了标题就明白了,这篇文章应该是关于 JavaScript 代理和反射机制的。
有13位网友表示赞同!
学习 Proxy 和 Reflect 可以让我对 JavaScript 有更深入的理解?
有19位网友表示赞同!
感觉 Proxy 和 Reflect 是提升 JavaScript 代码精度的利器!
有17位网友表示赞同!
这篇文章的内容应该是我想要了解的,期待能看到详细的例子和讲解!
有16位网友表示赞同!