欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析ES6中的Proxy与Reflect:掌握JavaScript高级特性

时间:11-22 神话故事 提交错误

大家好,今天小编来为大家解答以下的问题,关于深入解析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高级特性和的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

用户评论

铁树不曾开花

终于明白这两种神奇的东西在JS里的作用了!

    有12位网友表示赞同!

一笑傾城゛

平时用的很少,现在来看还挺有意思的,感觉可以拿来写一些高级的代码。

    有8位网友表示赞同!

纯情小火鸡

Proxy 和 Reflect 对 JavaScript 的掌握又提升了一个level。

    有18位网友表示赞同!

陌潇潇

这个 ES6 新特性一直想学习一下,有机会得好好看看代理和反射的使用场景。

    有14位网友表示赞同!

爱到伤肺i

之前对这两个名词没啥概念,看标题感觉应该是个很实用的东西。

    有12位网友表示赞同!

心悸╰つ

这篇文章的解读能让我更好地理解 Proxy 和 Reflect 的本质?

    有14位网友表示赞同!

琴断朱弦

看了这篇文章我可能可以尝试用它们优化代码效率呢?

    有6位网友表示赞同!

烟雨离殇

感觉学习 ES6 就意味着要接触到这两个新特性,很期待这篇深入讲解!

    有20位网友表示赞同!

男神大妈

代理和反射听起来还是很有特色的啊,希望能有清晰的例子来演示。

    有19位网友表示赞同!

孤单*无名指

我平时写 JavaScript 时很少用到 Proxy 和 Reflect,这篇文章应该能帮到我!

    有19位网友表示赞同!

几妆痕

感觉这个 Proxy 可以用来解决一些操作对象的特殊需求?

    有13位网友表示赞同!

蔚蓝的天空〃没有我的翅膀

希望这篇文章能够把这两个特性讲清楚,让我更容易理解。

    有11位网友表示赞同!

泪湿青衫

终于有时间学习 ES6 中的这些新知识,期待这篇深入浅出的讲解!

    有15位网友表示赞同!

念安я

想写一些更高级的JavaScript代码,Proxy 和 Reflect 应该很关键!

    有8位网友表示赞同!

Edinburgh°南空

看了标题就明白了,这篇文章应该是关于 JavaScript 代理和反射机制的。

    有13位网友表示赞同!

箜明

学习 Proxy 和 Reflect 可以让我对 JavaScript 有更深入的理解?

    有19位网友表示赞同!

抓不住i

感觉 Proxy 和 Reflect 是提升 JavaScript 代码精度的利器!

    有17位网友表示赞同!

念旧情i

这篇文章的内容应该是我想要了解的,期待能看到详细的例子和讲解!

    有16位网友表示赞同!

【深入解析ES6中的Proxy与Reflect:掌握JavaScript高级特性】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活