Reflect對象的方法清單如下, 共 13 個。
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)
上面這些方法的作用, 大部分與Object對象的同名方法的作用都是相同的, 而且它與Proxy對象的方法是一一對應的。 下面是對其中幾個方法的解釋。
( 1) Reflect.get(target, name, receiver)
查找并傳回target對象的name屬性, 如果沒有該屬性, 則傳回undefined。
如果name屬性部署了讀取函數, 則讀取函數的 this 綁定receiver。
var obj = {
get foo() {
return this.bar();
},
bar: function() {
...
}
};
// 下面語句會讓 this.bar()
// 變成調用 wrapper.bar()
Reflect.get(obj, "foo", wrapper);
(2) Reflect.set(target, name, value, receiver)
設定target對象的name屬性等于value。 如果name屬性設定了指派函數, 則指派函數的this綁定receiver。
( 3) Reflect.has(obj, name)
等同于name in obj。
( 4) Reflect.deleteProperty(obj, name)
等同于delete obj[name]。
( 5) Reflect.construct(target, args)
等同于new target(...args), 這提供了一種不使用new, 來調用構造函數的方法。
( 6) Reflect.getPrototypeOf(obj)
讀取對象的__proto__屬性, 對應Object.getPrototypeOf(obj)。
( 7) Reflect.setPrototypeOf(obj, newProto)
設定對象的__proto__屬性, 對應Object.setPrototypeOf(obj, newProto)。
( 8) Reflect.apply(fun, thisArg, args)
等同于Function.prototype.apply.call(fun, thisArg, args)。 一般來說, 如果要綁定一個函數的 this 對象, 可以這樣寫fn.apply(obj, args), 但是如果函數定義了自己的apply方法, 就隻能寫成Function.prototype.apply.call(fn, obj, args), 采用 Reflect 對象可以簡化這種操作。
另外, 需要注意的是, Reflect.set()、 Reflect.defineProperty()、 Reflect.freeze()、 Reflect.seal() 和Reflect.preventExtensions() 傳回一個布爾值, 表示操作是否成功。 它們對應的 Object 方法, 失敗時都會抛出錯誤。
// 失敗時抛出錯誤
Object.defineProperty(obj, name, desc);
// 失敗時傳回 false
Reflect.defineProperty(obj, name, desc);
上面代碼中, Reflect.defineProperty方法的作用與Object.defineProperty是一樣的, 都是為對象定義一個屬性。 但是, Reflect.defineProperty方法失敗時, 不會抛出錯誤, 隻會傳回false。