Reflect --> 反射
Reflect是什么呢? Reflect 是一个内置的js对象,它提供了一系列的方法供开发者访问一些JS底层的功能。由于它类似于其他语言的 反射 , 所以取名为 Reflect。
受函数式编程的影响,在ES5 中就已经提出了一个很重要的理念 --> 减少魔法,让代码更加的纯粹。 让一个语言中的功能以方法、函数或者对象的方式, 以API 的形式存在,不再使用特殊的语法出现,这种特殊的语法就是魔法。
ES6 中深入贯彻了这种理念, 它认为像是 对属性内存的控制、原型链的修改、函数的调用等等这些都是属于底层实现,属于一种魔法,应该抽取出来形成API 并且高度聚合在某个对象中, 所以造就了 Reflect
提供的 API:
Reflect.set()
// 设置对象 target的属性 propertyKey的值为value, 等同于给对象赋值
Reflect.set(target, propertyKey, value)
// 例如
const obj = {
a: 1,
b: 2
}
// 修改 a 的值
obj.a = 10
// 使用 Reflect
Reflect.set(obj, 'a', 10)
Reflect.get()
// 读取对象target的属性propertyKey, 等同于读取对象的属性值
Reflect.get(target, propertyKey)
// 10
Reflect.get(obj, 'a')
Reflect.apply()
aaa
// 调用一个指定的函数,并绑定this和参数列表。 等同于函数调用。
Reflect.apply(target, thisArgument, argumentList)
// 例如
function method (a, b) {
console.log("method:", a, b)
}
method(3, 5) // method 3 5
Reflect.apply(method, null, [3, 5]) // method 3 5
Reflect.deleteProperty()
// 删除一个对象属性
Reflect.deleteProperty(target, propertyKey)
const obj = {
a: 1,
b: 2
}
// delete obj.a
// console.log(obj) // { b: 2 }
Reflect.deleteProperty(obj, a)
console.log(obj) // { b: 2 }
Reflect.defineProperty()
Object.definePropert
// 类似于 Object.defineProperty, 不同的是如果配置出现问题, 返回 false 而不是报错
Reflect.defineProperty(target, propertyKey, attributes)
Reflect.construct()
// 用构造函数的方式创建一个对象
Relect.construct(target, argumentsList)
function Test(a, b) {
this.a = a;
this.b = b;
}
//const test = new Test(1, 2)
const test = Reflect.construct(Test, [1, 2])
Reflect.has()
// 判断一个对象是否拥有一个属性
Reflect.has(target, propertyKey)
const obj = {
a: 1
b; 2
}
// console.log('a' in obj)
Reflect.has(obj, 'a') // true | type is bollean