天天看點

es6 javascript的Reflect 對象的方法

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。

繼續閱讀