ES6 Reflect使用笔记
Reflect
Reflect 对象和Proxy对象一样, 为操作对象提供了新的API。
为什么使用 Reflect的方式来操作对象?
将 Object 对象上一些明显属于内部的方法放到 Reflect对象上。比如
Object.defindProperty也可以使用Reflect.defindProperty修改某些 Object 方法的返回结果
让 Object 操作都变成函数行为。
Reflect 对象的操作方法和 Proxy的方法一一对应, 很方便 Proxy对象来调用 Reflect 方法
例子:
const sum = function (num1, num2) {
return num1 + num2
}
const proxy = new Proxy(sum, {
apply(target, context, args) {
return Reflect.apply(...arguments) * 2
}
})
proxy(1,2) // 6
以上代码 proxy 的配置方法 apply和 Reflect的apply方法是对应关系,直接通过 Reflect.apply 来调用拦截函数 sum。并将函数执行后的结果 * 2。最终的结果是 6。
#### Reflect 对象和 Proxy的静态方法一样,同样是13个。
- Reflect.apply(target, context, args)
- Reflect.get(target, key, context)
- Reflect.set(target, key, value, context)
- Reflect.construct(target, args)
- Reflect.defindProperty(target, key, desc)
- Reflect.has(target, key)
- Reflect.deleteProperty(target, key)
- Reflect.setProperty(target, proto)
- Reflect.getProperty(target)
- Reflect.ownKeys(target)
- Reflect.isExtensible(target)
- Reflect.preventExtensions(target)
- Reflect.getOwnPropertyDescriptor(target, key)
Reflect.get(target, key, context)
target: 查找的对象
key: 查找的属性
context: 读取getter函数的上下文对象
const obj = {
name: 'qiqingfu',
get sayName() {
console.log(this.name)
}
}
const obj1 = {
name: 'zhangfei'
}
Reflect.get(obj, 'name') // qiqingfu
Reflect.get(obj, 'sayName', obj1) // zhangfei
如果第一个参数不是对象, Reflect.get方法会报错。
Reflect.set(target, key, value, context)
target: 要给哪个对象设置
key: 要设置的属性
value: 设置的值
返回值: boolean
const obj = {
value: 1,
set fn(newValue) {
return this.value = newValue
}
}
console.log(Reflect.set(obj, 'name', 'qiqingfu')) // true
console.log(Reflect.set(obj, 'fn', 2))
console.log(obj)
以上代码,给obj对象设置了一个name属性,其值为qiqingfu, 并且设置fn的时候被get函数拦截到了。
Reflect.has(target, key) 方法检测 target对象上有么有 key这个属性
返回值: boolean
const obj = {
name: 'qiqingfu',
a: 2
}
console.log(Reflect.has(obj, 'name')) // true
console.log(Reflect.has(obj, 'a')) // true
console.log(Reflect.has(obj, 'b')) // false
其实 Reflect.has 和 in 操作符类似。
Reflect.construct(target, args) 方法用于类似于 new 操作符
target: 目标函数
args: 实例化对象需要传递的参数 Array
返回值: 实例对象
function Prosen (name, age) {
this.name = name;
this.age = age
}
const prosen = Reflect.construct(Prosen, ['qiqingfu', 22])
// {name: 'qiqingfu', age: 22}
以上代码使用 Reflect.construct方法实例话一个对象,接受的参数为数组类型
Reflect.defineProperty(target, key, decs) 和 Object.defineProperty(target, key, decs) 一样
更推崇使用前者。
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
const obj = {
}
Reflect.defineProperty(obj, 'a', {
value: 1,
configurable: true, // 可配置
writable: true // 可写
})
// {a: 1}
以上代码给 obj 对象添加了一个 a属性, 其值为1并且是可配置和可修改的
Reflect.deleteProperty(target, key) 方法删除 target对象的key属性
const obj = {
a: 1
}
Reflect.defindProperty(obj, 'a')
console.log(obj) // {}
Reflect.getPropertyOf(target) 方法获取一个对象的原型对象
function Prosen() {
}
Prosen.prototype.age = 21
const prosen = Reflect.construct(Prosen, [])
// 获取原型对象的属性
const proto = Reflect.getPrototypeOf(prosen)
console.log(proto)
// {age: 21, constructor: ƒ}
以上代码 给 Prosen 构造函数的原型对象上添加了一个 age属性。并且通过 Reflect.construct方法实例化一个对象。那么就可以通过 Reflect.getPrototypeOf 方法获取一个对象的原型对象。
Reflect.setPrototypeOf(target, proto) 方法将 proto设置为 target对象的原型对象
function Prosen() {
}
Prosen.prototype.age = 21
const prosen = Reflect.construct(Prosen, [])
// 设置prosen 的原型对象
Reflect.setPrototypeOf(prosen, {b: 2})
此时, prosen的原型对象为 {b:2}, 而 construct 指针会被覆盖
Reflect.ownKeys(target) 获取对象的key值,返回值为数组
和 Object.ownKeys 相同。
const obj = {
a: 1,
[Symbol('c')]: 3,
}
Reflect.defineProperty(obj, 'b', {
value: 2,
configurable: true,
enumerable: true
})
console.log(Reflect.ownKeys(obj))
// ["a", "b", Symbol(c)]
返回值是一个数组, 存放着对象的 key值的集合。
Reflect.getOwnPropertyDescriptor(target, key) 方法获取一个对象key值的描述对象
返回值: Object
const obj = {
a: 1,
[Symbol('c')]: 3,
}
Reflect.defineProperty(obj, 'b', {
value: 2,
configurable: true,
enumerable: true
})
const decs = Reflect.getOwnPropertyDescriptor(obj, 'b')
console.log(decs)
/*
{value: 2, writable: false, enumerable: true, configurable: true}
*/
以上代码通过 Reflect.getOwnPropertyDescriptor方法获取一个对象属性的描述对象, 如果第一个参数不是对象会报错。而在 Object.getOwnPropertyDescriptor不会报错,只不过返回 undefind
ES6 Reflect使用笔记的更多相关文章
- ES6 Reflect的认识
首先我们要了解一下,为什么会新添加这么一个全局对象?如果你看过Reflect的一些函数,你就会发现,这个对象上的方法基本上都可以从Object上面找到,找不到的那些,也是可以通过对对象命令式的操作去实 ...
- ES6 Reflect 与 Proxy
概述 Proxy 与 Reflect 是 ES6 为了操作对象引入的 API . Proxy 可以对目标对象的读取.函数调用等操作进行拦截,然后进行操作处理.它不直接操作对象,而是像代理模式,通过对象 ...
- es6 Reflect对象详解
Reflect是ES6为操作对象而提供的新API,而这个API设计的目的只要有: 将Object对象的一些属于语言内部的方法放到Reflect对象上,从Reflect上能拿到语言内部的方法.如:Obj ...
- ES6 Reflect
1.Reflect概述 ES6 为了操作对象而提供的新 API 2.Reflect设计目的 (1)将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到 ...
- 《深入理解ES6》读书笔记
文章目录 第一章 块级绑定 1. var 声明与变量提升 2. let 与 var 的区别 第二章 字符串与正则表达式 1.字符串扩展 1.1 includes().startsWith() .end ...
- es6小白学习笔记(一)
1.let和const命令 1.es6新增了let和const命令,与var用法类似,但它声明的变量只在let所在的代码块内有效(块级作用域,es5只有全局和函数作用域) { let a = 1; v ...
- ES6新属性笔记
一.destructuring--解构赋值 1.数组解构赋值 (1)完全解构 let [a,b,c] = [1,2,3];//普通 console.log(a+":"+b+&quo ...
- Es6模块语法笔记
/** * Created by Administrator on 2017/4/15. */ /*---------------------export命令--------------------- ...
- JavaScript(ES6)学习笔记-Set和Map数据结构(一)
一.Set 1.ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. , , , , ']); s; // ...
随机推荐
- thinkphp5使用phpmailer发送邮件
1.首先让邮箱开启smtp服务,本案例使用163的SMTP服务器: smtp.163.com发送邮件 2.下载phpmailer,在tp项目里的extends文件夹下新建一个文件夹phpmailer, ...
- ES6扩展运算符...进行的数组删除
今天写了按照React小书写了Reducer,发现基础真是太重要了,所有关于上层建筑的细节都需要回到下层细节中去寻找,而且现在的基础也由ES3变成了ES6了. const ADD_USER = &qu ...
- List<Object> 使用Linq
List<Asset> bdList = allAsset.Where(m => m.Owner.Depts == view.DeptName).ToList(); var quer ...
- POJ 2891 Strange Way to Express Integers excrt/我真傻,真的
我真傻,真的 我单知道这道题在(b-b1)%d!=0时要判无解,哪成想自己却没有读完这组后面的数据而直接break掉...qwqfk 当 $ x \equiv b_1 ( mod a_1 ) ...
- 醉盏的第一篇博客-关于title的换行处理
在处理title的时候,有时候我们想要换行,标签元素是不可以的,下面有两种特殊字符来实现 <!DOCTYPE ><html> <head runat="serv ...
- HDU 5785 Interesting manacher + 延迟标记
题意:给你一个串,若里面有两个相邻的没有交集的回文串的话,设为S[i...j] 和 S[j+1...k],对答案的贡献是i*k,就是左端点的值乘上右端点的值. 首先,如果s[x1....j].s[x2 ...
- wamp 下运行Drupal慢的解决方法
1.Editing your php.ini and make realpath_cache_size=2M, 2.uncomment skip innodb in your my.cnf(my.in ...
- Shell笔试题2
1. 从a.log文件中提取包含"WARNING"或"FATAL",同时不包含"IGNOR"的行,然后提取以":"分割的 ...
- pygame 使用
模块概况 display image event key mouse font 类概况 Rect: 返回的矩阵区域(图片) Surface: 可以看做是一个贴图, 它就是来显示的 display(与显 ...
- jQuery 获取和设置表单元素
jQuery提供了val()方法,使用它我们可以快速地获取和设置表单的文本框.单选按钮.以及单选按钮的值. 使用val()不带参数,表示获取元素的值 使用val()给定参数,则表示把值赋给元素 如下: ...