es6 Reflect对象简介
Reflect对象简介
Reflect
对象与Proxy
对象一样,也是 ES6 为了操作对象而提供的新 API。Reflect
对象的设计目的有这样几个。
(1) 将Object
对象的一些明显属于语言内部的方法(比如Object.defineProperty
),放到Reflect
对象上。现阶段,某些方法同时在Object
和Reflect
对象上部署,未来的新方法将只部署在Reflect
对象上。也就是说,从Reflect
对象上可以拿到语言内部的方法。
(2) 修改某些Object
方法的返回结果,让其变得更合理。比如,Object.defineProperty(obj, name, desc)
在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)
则会返回false
。
// 老写法
try {
Object.defineProperty(target, property, attributes);
// success
} catch (e) {
// failure
}
// 新写法
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
(3) 让Object
操作都变成函数行为。某些Object
操作是命令式,比如name in obj
和delete obj[name]
,而Reflect.has(obj, name)
和Reflect.deleteProperty(obj, name)
让它们变成了函数行为。
// 老写法
'assign' in Object // true
// 新写法
Reflect.has(Object, 'assign') // true
(4)Reflect
对象的方法与Proxy
对象的方法一一对应,只要是Proxy
对象的方法,就能在Reflect
对象上找到对应的方法。这就让Proxy
对象可以方便地调用对应的Reflect
方法,完成默认行为,作为修改行为的基础。也就是说,不管Proxy
怎么修改默认行为,你总可以在Reflect
上获取默认行为。
Proxy(target, {
set: function(target, name, value, receiver) {
var success = Reflect.set(target,name, value, receiver);
if (success) {
log('property ' + name + ' on ' + target + ' set to ' + value);
}
return success;
}
});
上面代码中,Proxy
方法拦截target
对象的属性赋值行为。它采用Reflect.set
方法将值赋值给对象的属性,确保完成原有的行为,然后再部署额外的功能。
下面是另一个例子。
var loggedObj = new Proxy(obj, {
get(target, name) {
console.log('get', target, name);
return Reflect.get(target, name);
},
deleteProperty(target, name) {
console.log('delete' + name);
return Reflect.deleteProperty(target, name);
},
has(target, name) {
console.log('has' + name);
return Reflect.has(target, name);
}
});
上面代码中,每一个Proxy
对象的拦截操作(get
、delete
、has
),内部都调用对应的Reflect
方法,保证原生行为能够正常执行。添加的工作,就是将每一个操作输出一行日志。
有了Reflect
对象以后,很多操作会更易读。
// 老写法
Function.prototype.apply.call(Math.floor, undefined, [1.75]) // 1
// 新写法
Reflect.apply(Math.floor, undefined, [1.75]) // 1
es6 Reflect对象简介相关推荐
- es6 Reflect对象的静态方法
Reflect对象的静态方法 Reflect对象一共有 13 个静态方法. Reflect.apply(target, thisArg, args) Reflect.construct(target, ...
- es6 Reflect对象详解
Reflect是ES6为操作对象而提供的新API,而这个API设计的目的只要有: 将Object对象的一些属于语言内部的方法放到Reflect对象上,从Reflect上能拿到语言内部的方法.如:Obj ...
- ES6的Reflect对象
Reflect对象的方法与Proxy对象的方法一一对应,只要proxy对象上有的方法reflect也能找到. ES6将Object对象的一些属于语言内部的方法放到Reflect对象上,从Reflect ...
- 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 ...
- es6利用Reflect实现观察者模式,并详解Reflect对象
es6利用Reflect实现观察者模式,并详解Reflect对象 字面意思:反映;映出(影像) 先看一个简易的观察者模式: 上述观察者模式代码运行后输出: // 李四 20: // 哈哈 10: 分析 ...
- ES6中Reflect对象使用详解(附代码)
目录 目录 Reflect的方法 Reflect.get(target, name, receiver) Reflect.set(target, name, value, receiver) Refl ...
- es6 --- Reflect的静态方法
Reflect.get(target, name, receiver): 查找并返回 target对象的 name属性,若没有,返回undefined var myObject = {foo: 1,b ...
- Javascript Proxy对象 简介
Javascript Proxy对象 简介 本文转载自:众成翻译 译者:eJayYoung 链接:http://www.zcfy.cc/article/4755 原文:https://blog.cam ...
- Js中Reflect对象
Js中Reflect对象 Reflect是ES6起JavaScript内置的对象,提供拦截JavaScript操作的方法,这些方法与Proxy对象的handlers中的方法基本相同. 描述 Refle ...
最新文章
- 计算机房做法图集,万科建筑标准工程做法通用图集(全套)
- 初探云原生应用管理之:聊聊 Tekton 项目
- 问题 1044: [编程入门]三个字符串的排序
- “菜”鸟理解.NET Framework(CLI,CLS,CTS,CLR,FCL,BCL)
- k8s nodeSelector和affinity
- Java迭代器的一致_ArrayList中迭代器(Iterator)实现
- flutter中Image.network()网络图片加载失败使用默认图片显示
- python循环结构语句实现_Python的循环结构
- 科普:什么是权益证明?
- Dev C++ 英文模式改成中文模式
- 软件项目招投标中的“标的额”是什么意思?
- 泰山OFFICE技术讲座:宋体和Times New Roman字体的Tag表有哪些
- Linux下的硬件驱动——USB设备
- 文本串加密和解密程序。一个文本串可用事先给定的字母映射表进行加密
- 4种Java引用浅解
- 兄弟连IT教育-九年的发展!
- 写给自己,人生路远,勿忘初心
- C++没落了?学习C++没有前途了?从业者给你揭晓答案
- android锁屏快捷键设置,【Android高级】锁屏功能简单实现
- js html css淘宝足迹日历效果,JavaScript实现简单日历效果