小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文同时参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金
前言
Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与proxy handlers (en-US)的方法相同。Reflect不是一个函数对象,因此它是不可构造的。如果按照Java或者C#的说法,这个就是静态类。
所以new Reflect这样是不可以用的!
Reflect描述
与大多数全局对象不同Reflect并非一个构造函数,所以不能通过new运算符对其进行调用,或者将Reflect对象作为一个函数来调用。Reflect的所有属性和方法都是静态的(就像Math对象)。
仔细查看api会发现和Proxy的实现十分接近,其实Reflect就是proxy的默认实现
示例
let data = {
name: ''
}
const proxy = new Proxy(data, {})
在我们不添加方法进去的时候,它内部的get/set是怎么样执行的呢?
当我们没有定义get方法的时候,就等同于
const proxy = new Proxy(data, {
get(traget, property){
return Reflect.get(traget, property)
}
})
为什么要有Reflect
个人感觉主要是为了提供一套统一的用于操作对象的api
在这之前我们操作对象的方法一般就是用delete操作符或者Object的对象方法,下面有个例子:
let data = {
name: ''
age: 18
}
// 是否由对应的属性
console.log('name' in data)
// 删除属性值
console.log(delete data['age'])
// 获取对象全部key值
console.log(Object.keys(data))
使用 Reflect
let data = {
name: ''
age: 18
}
// 是否由对应的属性
console.log(Reflect.has(obj, 'name'))
// 删除属性值
console.log(Reflect.deleteProperty(obj, 'age'))
// 获取对象全部key值
console.log(Reflect.ownKeys(obj))