一、概述
其設(shè)計(jì)目的如下:
- 將
Object對(duì)象的一些明顯屬于語(yǔ)言內(nèi)部的方法(比如Object.defineProperty),放到Reflect對(duì)象上。 - 修改某些
Object方法的返回結(jié)果,讓其變得更合理。 - 讓
Object操作都變成函數(shù)行為。 -
Reflect對(duì)象的方法與Proxy對(duì)象的方法一一對(duì)應(yīng)。
二、靜態(tài)方法
1. Reflect.get(target, name, receiver)
查找并返回target對(duì)象的name屬性,如果沒(méi)有該屬性,則返回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)
設(shè)置target對(duì)象的name屬性等于value,this綁定receiver(可選)
3. Reflect.has(obj, name)
檢查obj中是否含有name屬性,返回布爾值
4. Reflect.deleteProperty(obj, name)
刪除obj中的name屬性,返回布爾值
5. Reflect.construct(target, args)
提供一種調(diào)用構(gòu)造函數(shù)的方法
function Greeting(name) {
this.name = name;
}
// new 的寫(xiě)法
const instance = new Greeting('張三');
// Reflect.construct 的寫(xiě)法
const instance = Reflect.construct(Greeting, ['張三']);
6. Reflect.getPrototypeOf(obj)
用于讀取對(duì)象的proto屬性,對(duì)應(yīng)Object.getPrototypeOf(obj)
7. Reflect.setPrototypeOf(obj, newProto)
用于設(shè)置目標(biāo)對(duì)象(obj)的原型,對(duì)應(yīng)Object.setPrototypeOf(obj, newProto)
const myObj = {};
// 舊寫(xiě)法
Object.setPrototypeOf(myObj, Array.prototype);
// 新寫(xiě)法
Reflect.setPrototypeOf(myObj, Array.prototype);
myObj.length // 0
7. Reflect.apply(func, thisArg, args)
是Function.prototype.apply.call(func, thisArg, args)方法的簡(jiǎn)化,用于綁定this對(duì)象后執(zhí)行給定函數(shù)。
const ages = [11, 33, 12, 54, 18, 96];
// 舊寫(xiě)法
const youngest = Math.min.apply(Math, ages);
// 新寫(xiě)法
const youngest = Reflect.apply(Math.min, Math, ages);
8. Reflect.defineProperty(target, propertyKey, attributes)
基本等同于Object.defineProperty,用來(lái)為對(duì)象定義屬性
9. Reflect.getOwnPropertyDescriptor(target, propertyKey)
基本等同于Object.getOwnPropertyDescriptor,用于得到指定屬性的描述對(duì)象
10. Reflect.isExtensible (target)
返回一個(gè)布爾值,表示當(dāng)前對(duì)象是否可擴(kuò)展
12. Reflect.preventExtensions(target)
用于讓一個(gè)對(duì)象變?yōu)椴豢蓴U(kuò)展
13. Reflect.ownKeys (target)
用于返回對(duì)象的所有屬性,基本等同于Object.getOwnPropertyNames與Object.getOwnPropertySymbols之和。
var myObject = {
foo: 1,
bar: 2,
[Symbol.for('baz')]: 3,
[Symbol.for('bing')]: 4,
};
// 舊寫(xiě)法
Object.getOwnPropertyNames(myObject)
// ['foo', 'bar']
Object.getOwnPropertySymbols(myObject)
//[Symbol(baz), Symbol(bing)]
// 新寫(xiě)法
Reflect.ownKeys(myObject)
// ['foo', 'bar', Symbol(baz), Symbol(bing)]