天天看点

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。

继续阅读