ES6中的Reflect对象重点梳理

概览

Reflect是一个内置的JS对象,它提供了一系列方法,可以让开发者通过调用这些方法,访问一些js底层功能由于它类似于其他语言的反射,因此取名为Reflect

一. 设计目的

  1. 将Object对象的一个明显属于JS语言内部的方法(比如Object.defineProperty),放到Reflect对象上。现阶段,某些方法同时在Object和Relect对象上部署,未来的新方法将只部署在Reflect对象上。也就是说,从Reflect对象上可以拿到语言内部的方法;
  2. 修改某些Object返回的结果,让其变的合理性。比如Object.defineProperty(obj,propKey,desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj,name,desc)则会返回false;
// 旧写法
try {
  Object.defineProperty(target, property, attributes);
} catch(e) {
  
}

// 新写法
if(Reflect.defineProperty(target, property, attributes)){
  
} else {
  
}
  1. Reflect对象的方法与Proxy对象的方法对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法,这就使Proxy对象可以方便地调用对应的Reflect方法来完成默认行为,作为修改行为的基础。

二. 静态方法

  1. Reflect.getPrototypeOf(target):类似于 Object.getPrototypeOf()。
  2. Reflect.setPrototypeOf(target, prototype):设置对象原型的函数. 返回一个 Boolean, 如果更新成功,则返回true。
  3. Reflect.isExtensible(target):类似于 Object.isExtensible()
  4. Reflect.preventExtensions(target):类似于 Object.preventExtensions()。返回一个Boolean。
  5. Reflect.getOwnPropertyDescriptor(target, propertyKey) :类似于 Object.getOwnPropertyDescriptor()。如果对象中存在该属性,则返回对应的属性描述符, 否则返回 undefined.
  6. Reflect.defineProperty(target, propertyKey, attributes):和 Object.defineProperty() 类似。如果设置成功就会返回 true
  7. Reflect.ownKeys(target):返回一个包含所有自身属性(不包含继承属性)的数组。(类似于Object.keys(), 但不会受enumerable影响)。
  8. Reflect.has(target, propertyKey) :判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同。
  9. Reflect.get(target, propertyKey[, receiver]):获取对象身上某个属性的值,类似于 target[name]。
  10. Reflect.set(target, propertyKey, value[, receiver]):将值分配给属性的函数。返回一个Boolean,如果更新成功,则返回true。
  11. Reflect.deleteProperty(target, propertyKey) :作为函数的delete操作符,相当于执行 delete target[name]。
  12. Reflect.apply(target, thisArgument, argumentsList) :对一个函数进行调用操作,同时可以传入一个数组作为调用参数。和Function.prototype.apply() 功能类似。
  13. Reflect.construct(target, argumentsList[, newTarget]):对构造函数进行 new 操作,相当于执行 new target(…args)。

三. receiver参数

Proxy的get、set捕获器还有receiver参数,receiver代表的就是代理对象本身。主要是为了改变this属性
如果属性部署了读取函数(getter),则读取函数的this绑定receiver

const myObject ={
foo: 1,
get baz() {
// this执行obj
return this.foo
}
}
const obj = {
foo: 9
}
Reflect.get(myObject,'baz',obj )  // 9 

同get,如果属性部署了赋值函数(setter),则读取函数的this绑定receiver

四. Reflect.ownKeys(target)

Reflect.ownKeys 方法返回一个由目标对象自身的属性键组成的数组。它的返回值等同于Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))。

获取对象中的属性梳理:

在JavaScript中,我们有4种方法可以获取对象中的属性,分别是for…in、Object.keys()、Object.getOwnPropertyNames()、Reflect.ownKeys(),下面分别说下他们之间的区别:

for…in
for…in循环会遍历对象自身的所有属性,以及它原型上的属性,并且,for…in只遍历对象中可枚举的属性(enumerate为true)。像 Array 和 Object 使用内置构造函数所创建的对象都会继承自 Object.prototype 和 String.prototype 的不可枚举属性。

可枚举属性:简单来说就是JS对象中的属性是否可以列举出来。
Object.keys(obj)
它可以得到自身可枚举的属性,但得不到原型链上的属性,同时Symbols 属性也得不到。

Object.getOwnPropertyNames(obj)
它可以得到自身所有的属性(包括可枚举属性以及不可枚举属性),但得不到原型链上的属性, 当然Symbols 属性也得不到.

Reflect.ownKeys(obj)
它可以得到对象的所有属性,基本等同于上述的Object.getOwnPropertyNames(obj)加上Object.getOwnPropertySymbols(obj)返回之和,这里的getOwnPropertySymbols方法单独只返回对象中包含symbols属性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值