在ES6推出之前,对对象的操作的是命令式行为,比如为对象增加属性并赋值objectName[attrName] = value
,现在ES6推出一种全局对象Reflect,使对对象的操作函数行为化,比如为对象增加属性并赋值Reflect.set(objectName, attrName, value)
Reflect
一、出现的主要意义
经过ES6书中解释及个人实践,本人认为,Reflect全局对象出现的意义有两大点
1、配合Proxy全局对象的出现【其两者方法一一对应】
2、将对象的命令式操作行为改变为函数式操作行为【本人看着有点爽,喜欢函数模块处理的方式】
二、其相应的常用方法【增删改查】
// 喜欢在对象上加层操作中间件
const obj = new Proxy({}, {})
// 增加属性
Reflect.set(obj, 'add', 'add')
console.log(obj) // Proxy {add: "add"}
// 修改属性
Reflect.set(obj, 'add', 'changeAdd')
console.log(obj) // Proxy {add: "changeAdd"}
// 查询属性
console.log(Reflect.has(obj, 'add')) // true
// 删除属性
Reflect.deleteProperty(obj, 'add')
console.log(obj) // Proxy {}
注意:当需要添加属性时,且属性值为以一个函数,我们可以使用this
来指代数据源object
const obj = new Proxy({
'first': 'first',
'second': 'second',
'third': undefined,
}, {
get: (target, property) => target[property] === undefined ? "暂无数据" : target[property],
})
// 布置自定义Iterator接口
Reflect.set(obj, Symbol.iterator, function* () {
for (const key in this) { // this指代数据源obj,还可以这么玩,有意思
yield this[key]
}
})
console.log([...obj]) // ["first", "second", "暂无数据"]
剩余就不多加累述了。