Reflect對(duì)象與Proxy對(duì)象一樣,也是 ES6 為了操作對(duì)象而提供的新 API。Reflect對(duì)象的設(shè)計(jì)目的有這樣幾個(gè)
(1) 將Object對(duì)象的一些明顯屬于語(yǔ)言?xún)?nèi)部的方法(比如Object.defineProperty),放到Reflect對(duì)象上?,F(xiàn)階段,某些方法同時(shí)在Object和Reflect對(duì)象上部署,未來(lái)的新方法將只部署在Reflect對(duì)象上。也就是說(shuō),從Reflect對(duì)象上可以拿到語(yǔ)言?xún)?nèi)部的方法。
(2) 修改某些Object方法的返回結(jié)果,讓其變得更合理。比如,Object.defineProperty(obj, name, desc)在無(wú)法定義屬性時(shí),會(huì)拋出一個(gè)錯(cuò)誤,而Reflect.defineProperty(obj, name, desc)則會(huì)返回false。
// 老寫(xiě)法
try {
Object.defineProperty(target, property, attributes);
// success
} catch (e) {
// failure
}
// 新寫(xiě)法
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
(3) 讓Object操作都變成函數(shù)行為。某些Object操作是命令式,比如name in obj和delete obj[name],而Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)讓它們變成了函數(shù)行為。
// 老寫(xiě)法
'assign' in Object // true
// 新寫(xiě)法
Reflect.has(Object, 'assign') // true
(4)Reflect對(duì)象的方法與Proxy對(duì)象的方法一一對(duì)應(yīng),只要是Proxy對(duì)象的方法,就能在Reflect對(duì)象上找到對(duì)應(yīng)的方法。這就讓Proxy對(duì)象可以方便地調(diào)用對(duì)應(yīng)的Reflect方法,完成默認(rèn)行為,作為修改行為的基礎(chǔ)。也就是說(shuō),不管Proxy怎么修改默認(rèn)行為,你總可以在Reflect上獲取默認(rèn)行為。
Reflect對(duì)象一共有 13 個(gè)靜態(tài)方法
- Reflect.apply(target, thisArg, args)
- Reflect.construct(target, args)
- Reflect.get(target, name, receiver)
- Reflect.set(target, name, value, receiver)
- Reflect.defineProperty(target, name, desc)
- Reflect.deleteProperty(target, name)
- Reflect.has(target, name)
- Reflect.ownKeys(target)
- Reflect.isExtensible(target)
- Reflect.preventExtensions(target)
- Reflect.getOwnPropertyDescriptor(target, name)
- Reflect.getPrototypeOf(target)
- Reflect.setPrototypeOf(target, prototype)
Reflect.has
Reflect.has方法對(duì)應(yīng)name in obj里面的in運(yùn)算符。
var myObject = {
foo: 1,
};
// 舊寫(xiě)法
'foo' in myObject // true
// 新寫(xiě)法
Reflect.has(myObject, 'foo') // true
Reflect.deleteProperty
Reflect.deleteProperty方法等同于delete obj[name],用于刪除對(duì)象的屬性。
const myObj = { foo: 'bar' };
// 舊寫(xiě)法
delete myObj.foo;
// 新寫(xiě)法
Reflect.deleteProperty(myObj, 'foo');
該方法返回一個(gè)布爾值。如果刪除成功,或者被刪除的屬性不存在,返回true;刪除失敗,被刪除的屬性依然存在,返回false。