Reflect对象的方法与Proxy对象的方法一一对应,只要proxy对象上有的方法reflect也能找到。

ES6将Object对象的一些属于语言内部的方法放到Reflect对象上,从Reflect上能拿到语言内部的方法。如:Object.defineProperty。

Reflect一共有13个静态方法:

Reflect.apply(target, thisArg, args)
Reflect.construct(target, args)
Reflect.get(target, name, receiver)
Reflect.set(target, name, value, receiver)
Reflect.defineProperty(target, name, desc)
Reflect.deleteProperty(target, name)
Reflect.has(target, name)
Reflect.ownKeys(target)
Reflect.isExtensible(target)
Reflect.preventExtensions(target)
Reflect.getOwnPropertyDescriptor(target, name)
Reflect.getPrototypeOf(target)
Reflect.setPrototypeOf(target, prototype)

Reflect.get(target, name, receiver)

Reflect.get方法查找并返回target的name属性,如果没有,则返回undefined。如果第一个参数不是对象,则Reflect.get则会报错。

// Reflect.get(target, name, receiver) var myObject = {foo: 1
}
Reflect.get(myObject, 'foo')   // 1

如果name属性是读取函数(getter),则读取函数里的this绑定Reflect.get的receiver参数。

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

Reflect.set(target, name, value, receiver)

Reflect.set方法设置target对象的name属性等于value。

// Reflect.set(target, name, value, receiver);var myObject = {foo: 1,set bar(value) {return this.foo = value;},
}myObject.foo   // 1

Reflect.set(myObject, 'foo', 2);
myObject.foo    // 2

如果name参数是一个赋值函数,则赋值函数的this绑定Reflect.set的receiver参数。

var myObject = {foo: 4,set bar(value) {return this.foo = value;},
};var myReceiverObject = {foo: 0,
};Reflect.set(myObject, 'bar', 1, myReceiverObject);
myObject.foo // 4
myReceiverObject.foo // 1

Reflect.has(obj, name)

Reflect.has对应 name in obj 里面的in操作,如果第一个参数不是对象,Reflect.has和in都会报错。

var myObject = {foo: 1,
};// 旧写法
'foo' in myObject    // true// 新写法
Reflect.has(myObject, 'foo')    // true

Reflect.deleteProperty(obj, name)

Reflect.deleteProperty方法等同于delete obj[name],用于删除对象属性。该方法返回一个布尔值。如果删除成功或删除的属性不存在,则返回true,如果删除失败,删除的属性依然还在,则返回false。

const myObj = { foo: 'bar' };// 旧写法
delete myObj.foo;// 新写法
Reflect.deleteProperty(myObj, 'foo');

Reflect.construct(target, args)

Reflect.construct方法等同于new target(...args),这提供了一种不使用new,来调用构造函数的方法。

function Greeting(name) {this.name = name;
}// new 的写法
const instance = new Greeting('张三');// Reflect.construct 的写法
const instance = Reflect.construct(Greeting, ['张三']);

Reflect.getPrototypeOf(obj)

Reflect.getPrototypeOf方法用读取对象的__proto__属性,对应Object.getPrototypeOf(obj)方法。它们的区别是,如果参数不是对象,Object.getPrototypeOf会将参数转化为对象,而Reflect.getPrototypeOf会报错。

const myObj = new FancyThing();// 旧写法
Object.getPrototypeOf(myObj) === FancyThing.prototype;// 新写法
Reflect.getPrototypeOf(myObj) === FancyThing.prototype;

Reflect.setPrototypeOf(obj, newProto)

Reflect.setPrototypeOf方法是设置对象的__proto__属性,返回第一个参数对象,对应Object.setPrototypeOf(obj, newProto)。如果第一个参数不是对象,Object.setPrototypeOf会返回第一个参数对象,而Reflect.setPrototypeOf会报错。如果第一个参数是undefined或null,则两个都会报错。

const myObj = new FancyThing();// 旧写法
Object.setPrototypeOf(myObj, OtherThing.prototype);// 新写法
Reflect.setPrototypeOf(myObj, OtherThing.prototype);

Reflect.apply(func, thisArgs, args)

Reflect.apply相当于fn.apply

const ages = [11, 33, 12, 54, 18, 96];// 旧写法
const youngest = Math.min.apply(Math, ages);
const oldest = Math.max.apply(Math, ages);
const type = Object.prototype.toString.call(youngest);// 新写法
const youngest = Reflect.apply(Math.min, Math, ages);
const oldest = Reflect.apply(Math.max, Math, ages);
const type = Reflect.apply(Object.prototype.toString, youngest, []);

Reflect.defineProperty(target, propertyKey, attributes)

Reflect.defineProperty等同于Object.defineProperty,用来为对象定义属性。未来后者会被逐渐废除。如果第一个参数不是对象,就会抛出错误信息。

function MyDate() {/*…*/
}// 旧写法
Object.defineProperty(MyDate, 'now', {value: () => Date.now()
});// 新写法
Reflect.defineProperty(MyDate, 'now', {value: () => Date.now()
});

Reflect.getOwnPropertyDescriptor(target, propertyKey)

Reflect.getOwnPropertyDescriptor方法等同于Object.getOwnPropertyDescriptor,用于得到指定属性的描述对象,将来会代替后者。如果第一个参数不是对象Object.getOwnPropertyDescriptor不报错,返回undefined,而Reflect.getOwnPropertyDescriptor会报错,表示参数非法。

var myObject = {};
Object.defineProperty(myObject, 'hidden', {value: true,enumerable: false,
});// 旧写法
var theDescriptor = Object.getOwnPropertyDescriptor(myObject, 'hidden');// 新写法
var theDescriptor = Reflect.getOwnPropertyDescriptor(myObject, 'hidden');

Reflect.isExtensible (target)

Reflect.isExtensible等同于Object.isExtensible,返回一个布尔值,表示当前对象是否可扩展。如果参数不是对象,Object.isExtensible会返回false,因为本来就是不可扩展的,而Reflect.isExtensible则报错。

const myObject = {};// 旧写法
Object.isExtensible(myObject) // true// 新写法
Reflect.isExtensible(myObject) // true

Reflect.preventExtensions(target)

Reflect.preventExtensions等同于Object.preventExtensions,用于让一个对象变为不可扩展,返回一个布尔值,表示是否操作成功。如果参数不是对象,Object.preventExtensions在ES5下会报错,ES6下会返回传入的值,Reflect.preventExtensions则会报错。

var myObject = {};// 旧写法
Object.preventExtensions(myObject) // Object {}// 新写法
Reflect.preventExtensions(myObject) // true

Reflect.ownKeys (target)

Reflect.ownKeys方法用于返回对象的所有属性,等同于Object.getOwnPropertyNames与Object.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)]

原文:

https://www.cnblogs.com/kdcg/p/9139273.html

转载于:https://www.cnblogs.com/xjy20170907/p/11557876.html

ES6的Reflect对象相关推荐

  1. ES6中Reflect对象使用详解(附代码)

    目录 目录 Reflect的方法 Reflect.get(target, name, receiver) Reflect.set(target, name, value, receiver) Refl ...

  2. es6 Reflect对象的静态方法

    Reflect对象的静态方法 Reflect对象一共有 13 个静态方法. Reflect.apply(target, thisArg, args) Reflect.construct(target, ...

  3. es6 Reflect对象简介

    Reflect对象简介 Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API.Reflect对象的设计目的有这样几个. (1) 将Object对象的一些明显属于语言内部 ...

  4. es6相关面试题:1.rest参数;2.new.target;3.object.defineProperty与Proxy的区别;4.Reflect对象作用;5.lterator迭代器;6.async

    文章目录 说说对ES6中rest参数的理解 说说你对new.target的理解 谈谈object.defineProperty与Proxy的区别 ES6中的Reflect对象有什么用? 简单介绍下ES ...

  5. es6利用Reflect实现观察者模式,并详解Reflect对象

    es6利用Reflect实现观察者模式,并详解Reflect对象 字面意思:反映;映出(影像) 先看一个简易的观察者模式: 上述观察者模式代码运行后输出: // 李四 20: // 哈哈 10: 分析 ...

  6. es6 Reflect对象详解

    Reflect是ES6为操作对象而提供的新API,而这个API设计的目的只要有: 将Object对象的一些属于语言内部的方法放到Reflect对象上,从Reflect上能拿到语言内部的方法.如:Obj ...

  7. ES6 之Reflect 与 Proxy概述

    Proxy 与 Reflect 是 ES6 为了操作对象引入的 API .Proxy 可以对目标对象的读取.函数调用等操作进行拦截,然后进行操作处理. 概述 Proxy 与 Reflect 是 ES6 ...

  8. 【ES6】Proxy对象

    [ES6]Proxy对象 一.Proxy的基本用法 二.Proxy示例的方法 1)get() 2)set() 3)apply() 查看更多ES6教学文章: 参考文献 引言:ES6规范里面新增了Prox ...

  9. ES6:Reflect

    Reflect 概述. Relflect对象与Proxy对象一样,也是ES6为了操作对象而提供的新的API.Reflect对象的设计目的有几个. (1)将Object对象的一些明显属于语言内部的方法( ...

最新文章

  1. 2022-2028年中国塑料零部件行业市场发展规模及市场分析预测报告
  2. python爬虫实战,requests模块,Python实现抓取头条街拍美图
  3. hive 写入mysql 覆盖_替换Hive的元数据库derby
  4. 计算机教育中缺失的一课 · the missing semester of your cs education
  5. jq js json 转字符串_JQuery如何把JSON字符串转为JSON对象
  6. Jenkins打包之本地远程自动打包教程
  7. Struts2之文件上传
  8. 决策树-线性二分类+非线性二分类
  9. micropython入门教程-【ESP8266】MicroPython的快速入门教程
  10. postgresql安装hypopg
  11. 【第一部分】04Leetcode刷题
  12. vue-router模块划分
  13. ARFoundation系列讲解 - 63 人脸跟踪四
  14. 惠普HP CM1312nfi彩色激光打印机硒鼓替代方案
  15. CameraLink简介
  16. Quartz 定时任务
  17. OFDM子载波频率 知乎_频谱中射频干扰信号流化、分析与回放
  18. Dapps解封大众市场的动力
  19. centos 6 php mysql_Centos 6安装完美搭建mysql、php、apache之旅
  20. vue3编写组件的几种方式

热门文章

  1. HDU 2017 字符串统计
  2. POJ1279 Art Gallery 多边形的核
  3. JQuery实现广告效果(滚动切换)
  4. Flutter AnimatedSwitcher 动画切换组件的基本使用
  5. js中if表达式判断规则
  6. Bluetooth篇 开发实例之六 蓝牙RSSI计算距离
  7. jsp 静态资源 打入jar
  8. VS2003.NET不能调试怎么办
  9. asp.net 去除字符串右侧的最后一个字符
  10. TreeView的checked事件