ES6之Reflect

一、概述

其设计目的如下:

  1. Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。
  2. 修改某些Object方法的返回结果,让其变得更合理。
  3. Object操作都变成函数行为。
  4. Reflect对象的方法与Proxy对象的方法一一对应。

二、静态方法

1. Reflect.get(target, name, receiver)

查找并返回target对象的name属性,如果没有该属性,则返回undefined

var myObject = {
  foo: 1,
  bar: 2,
  get baz() {
    return this.foo + this.bar;
  },
}
Reflect.get(myObject, 'foo') // 1

var myReceiverObject = {
  foo: 4,
  bar: 4,
};
Reflect.get(myObject, 'baz', myReceiverObject) // 8
2. Reflect.set(target, name, value, receiver)

设置target对象的name属性等于value,this绑定receiver(可选)

3. Reflect.has(obj, name)

检查obj中是否含有name属性,返回布尔值

4. Reflect.deleteProperty(obj, name)

删除obj中的name属性,返回布尔值

5. Reflect.construct(target, args)

提供一种调用构造函数的方法

function Greeting(name) {
  this.name = name;
}

// new 的写法
const instance = new Greeting('张三');

// Reflect.construct 的写法
const instance = Reflect.construct(Greeting, ['张三']);
6. Reflect.getPrototypeOf(obj)

用于读取对象的proto属性,对应Object.getPrototypeOf(obj)

7. Reflect.setPrototypeOf(obj, newProto)

用于设置目标对象(obj)的原型,对应Object.setPrototypeOf(obj, newProto)

const myObj = {};

// 旧写法
Object.setPrototypeOf(myObj, Array.prototype);

// 新写法
Reflect.setPrototypeOf(myObj, Array.prototype);

myObj.length // 0
7. Reflect.apply(func, thisArg, args)

Function.prototype.apply.call(func, thisArg, args)方法的简化,用于绑定this对象后执行给定函数。

const ages = [11, 33, 12, 54, 18, 96];

// 旧写法
const youngest = Math.min.apply(Math, ages);

// 新写法
const youngest = Reflect.apply(Math.min, Math, ages);
8. Reflect.defineProperty(target, propertyKey, attributes)

基本等同于Object.defineProperty,用来为对象定义属性

9. Reflect.getOwnPropertyDescriptor(target, propertyKey)

基本等同于Object.getOwnPropertyDescriptor,用于得到指定属性的描述对象

10. Reflect.isExtensible (target)

返回一个布尔值,表示当前对象是否可扩展

12. Reflect.preventExtensions(target)

用于让一个对象变为不可扩展

13. Reflect.ownKeys (target)

用于返回对象的所有属性,基本等同于Object.getOwnPropertyNamesObject.getOwnPropertySymbols之和。

var myObject = {
  foo: 1,
  bar: 2,
  [Symbol.for('baz')]: 3,
  [Symbol.for('bing')]: 4,
};

// 旧写法
Object.getOwnPropertyNames(myObject)
// ['foo', 'bar']

Object.getOwnPropertySymbols(myObject)
//[Symbol(baz), Symbol(bing)]

// 新写法
Reflect.ownKeys(myObject)
// ['foo', 'bar', Symbol(baz), Symbol(bing)]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 Reflect 对象是一个全局的普通的对象。Reflect 的原型就是 Object。我们来验证下 Refl...
    前端_Fn阅读 3,532评论 0 0
  • 本人自学es6已经有一段时间了,只觉得有些时候很是枯燥无味, 时而又觉得在以后的职业生涯中会很有用,因为es6的很...
    可乐_37d3阅读 5,455评论 0 0
  • Reflect对象是ES6为了操作对象提供的新的API,它为了实现将object对象上的一些明显属于语言内部...
    我家的猫子在哪里阅读 3,114评论 0 0
  • Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API。Reflect对象的设计目的...
    SunshineBrother阅读 3,021评论 0 2
  • Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而R...
    恒星的背影阅读 1,599评论 0 1