购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.11 Reflect

Reflect是ES6为操作对象而提供的新API,Reflect设计的目的有以下几点:

(1)主要是优化了语言内部的方法,把Object对象的一些内部方法放在Reflect上,例如Object.defineProperty()。

(2)修改Object方法的返回值,例如:Object.definePropery(obj,name,desc)无法定义属性时报错,而Reflect.definedProperty(obj,name,desc)的返回值为false。

(3)让Object变成函数的行为,如以前的name in obj和delete obj[name]使用新方法Reflect.has(name)和Reflect.deleteProperty(obj,name)替代。

(4)Reflect方法和Proxy方法一一对应。主要是为了实现本体和代理的接口一致性,方便用户通过代理操作本体。

Reflect一共有13个静态方法,这些方法的作用大部分与Object对象的同名方法相同,而且与Proxy对象的方法一一对应。

2.11.1 Reflect()静态方法

Reflect对象一共有13个静态方法,下面对其中的10个对象用老写法和新写法做对比演示其区别。

1.Reflect.get()

Reflect.get()方法用于获取对象中对应key的值,如代码示例2-128所示。

代码示例2-128 chapter02\es6_demo\11_reflect\01.js

2.Reflect.set()

Reflect.set()函数用来设置对象中key对应的值,如代码示例2-129所示。

代码示例2-129 chapter02\es6_demo\11_reflect\02.js

3.Reflect.has()

判断某个key是否属于这个对象,如代码示例2-130所示。

代码示例2-130 chapter02\es6_demo\11_reflect\03.js

4.Reflect.defineProperty()

定义对象的属性和值等价于Object.defineProperty(),如代码示例2-131所示。

代码示例2-131 chapter02\es6_demo\11_reflect\04.js

5.Reflect.deleteProperty()

删除对象中的某个属性,如代码示例2-132所示。

代码示例2-132 chapter02\es6_demo\11_reflect\05.js

6.Reflect.construct()

实例化类等价于new,如代码示例2-133所示。

代码示例2-133 chapter02\es6_demo\11_reflect\06.js

7.Reflect.getPrototypeOf()

读取proto等价于Object.getPrototypeOf(),不同的是如果方法传递的不是对象,则会报错,如代码示例2-134所示。

代码示例2-134 chapter02\es6_demo\11_reflect\07.js

8.Reflect.setPrototypeOf()

设置proto等价于Object.setPrototypeOf(),不同的是返回一个boolean类型表示是否设置成功,如代码示例2-135所示。

代码示例2-135 chapter02\es6_demo\11_reflect\08.js

9.Reflect.apply()

想必apply()方法大家都很了解了,Reflect.apply()等价于Function.prototype.apply.call(),如代码清单2-136所示。

代码示例2-136 chapter02\es6_demo\11_reflect\09.js

10.Reflect.getOwnPropertyDescriptor()

等价于Object.getOwnPropertyDescriptor(),用于获取属性描述的对象,如代码示例2-137所示。

代码示例2-137 chapter02\es6_demo\11_reflect\10.js

2.11.2 Reflect与Proxy组合使用

通过Reflect和Proxy组合实现观察者模式,如代码示例2-138所示。

代码示例2-138 chapter02\es6_demo\11_reflect\11_observer.js nfQXySQ0a7pLFojN7S2KO8Ismog3fK5zYdd2j4EJPxT02NL43RKwn+fAyj82im0D

点击中间区域
呼出菜单
上一章
目录
下一章
×