一、概述
其设计目的如下:
- 将
Object
对象的一些明显属于语言内部的方法(比如Object.defineProperty
),放到Reflect
对象上。 - 修改某些
Object
方法的返回结果,让其变得更合理。 - 让
Object
操作都变成函数行为。 -
Reflect
对象的方法与Proxy
对象的方法一一对应。
二、静态方法
1. Reflect.get(target, name, receiver)
查找并返回target对象的name属性,如果没有该属性,则返回undefined
var myObject = {
foo: 1,
bar: 2,
get baz() {
return this.foo + this.bar;
},
}
Reflect.get(myObject, 'foo') // 1
var myReceiverObject = {
foo: 4,
bar: 4,
};
Reflect.get(myObject, 'baz', myReceiverObject) // 8
2. Reflect.set(target, name, value, receiver)
设置target对象的name属性等于value,this绑定receiver(可选)
3. Reflect.has(obj, name)
检查obj中是否含有name属性,返回布尔值
4. Reflect.deleteProperty(obj, name)
删除obj中的name属性,返回布尔值
5. Reflect.construct(target, args)
提供一种调用构造函数的方法
function Greeting(name) {
this.name = name;
}
// new 的写法
const instance = new Greeting('张三');
// Reflect.construct 的写法
const instance = Reflect.construct(Greeting, ['张三']);
6. Reflect.getPrototypeOf(obj)
用于读取对象的proto属性,对应Object.getPrototypeOf(obj)
7. Reflect.setPrototypeOf(obj, newProto)
用于设置目标对象(obj)的原型,对应Object.setPrototypeOf(obj, newProto)
const myObj = {};
// 旧写法
Object.setPrototypeOf(myObj, Array.prototype);
// 新写法
Reflect.setPrototypeOf(myObj, Array.prototype);
myObj.length // 0
7. Reflect.apply(func, thisArg, args)
是Function.prototype.apply.call(func, thisArg, args)
方法的简化,用于绑定this对象后执行给定函数。
const ages = [11, 33, 12, 54, 18, 96];
// 旧写法
const youngest = Math.min.apply(Math, ages);
// 新写法
const youngest = Reflect.apply(Math.min, Math, ages);
8. Reflect.defineProperty(target, propertyKey, attributes)
基本等同于Object.defineProperty
,用来为对象定义属性
9. Reflect.getOwnPropertyDescriptor(target, propertyKey)
基本等同于Object.getOwnPropertyDescriptor
,用于得到指定属性的描述对象
10. Reflect.isExtensible (target)
返回一个布尔值,表示当前对象是否可扩展
12. Reflect.preventExtensions(target)
用于让一个对象变为不可扩展
13. Reflect.ownKeys (target)
用于返回对象的所有属性,基本等同于Object.getOwnPropertyNames
与Object.getOwnPropertySymbols
之和。
var myObject = {
foo: 1,
bar: 2,
[Symbol.for('baz')]: 3,
[Symbol.for('bing')]: 4,
};
// 旧写法
Object.getOwnPropertyNames(myObject)
// ['foo', 'bar']
Object.getOwnPropertySymbols(myObject)
//[Symbol(baz), Symbol(bing)]
// 新写法
Reflect.ownKeys(myObject)
// ['foo', 'bar', Symbol(baz), Symbol(bing)]