Reflect是一个内置的对象。它提供拦截JavaScript操作的方法。这些方法与Proxy 的方法相同。Reflect不是一个函数对象。因此它是不可构造的。
一、Reflect.apply();
- target: 目标函数。
- thisArgument: target函数调用时绑定的this对象。
- argumentsList: target函数调用时传入的实参列表,该参数应该是一个类数组的对象。
返回值
是执行完目标函数的执行结果。
function fn (v, e) {
console.log(this.a, v, e)
}
const obj = {
a: 123
}
// fn 目标函数。obj需要绑定的this对象。第三个参数:是一个数组或者一个伪数组
Reflect.apply(fn, obj, [2, 66]);
// 输出 123 2 66;
二、Reflect.construct()
- target:被运行的目标构造函数
- argumentsList:类数组,目标构造函数调用时的参数。
- newTarget(可选): 作为新创建对象的原型对象的constructor属性, 参考 new.target 操作符,默认值为targe 就是constructor指向(绑定)一个新的对象。
#### 返回值
构造的新的对象。且this指向指定对象。如果没有指向则是构造函数自己。
function fn (q) {
this.name = q
}
function fn1 () {
console.log(12)
this.a = 12;
}
const res = Reflect.construct(fn, ['23333333'], fn1)
console.log(res.name)
三、Reflect.defineProperty()
- target: 目标对象。
- propertyKey: 要定义或修改的属性的名称。
- attributes: 要定义或修改的属性的描述。
返回值
Boolean : 成功为true 失败为false;
const obj = {};
Reflect.defineProperty(obj, 'name', {value: 'zhangsan'})
console.log(obj) // 输出 {}
console.log(obj.name) // 输出 zhangsan
四、Reflect.deleteProperty()
- target: 删除属性的目标对象。
- propertyKey: 需要删除的属性的名称。
返回值
Boolean : 成功为true 失败为false;
var obj = { x: 1, y: 2 };
Reflect.deleteProperty(obj, "x"); // true
obj; // { y: 2 }
五、Reflect.get()
- target: 需要取值的目标对象。
- propertyKey: 需要获取的值的键值。
返回值
获取属性的值
// Object
var obj = { x: 1, y: 2 };
Reflect.get(obj, "x"); // 1
六、Reflect.getOwnPropertyDescriptor()
- target: 需要寻找属性的目标对象。 // 会强制转为对象处理
- propertyKey: 获取自己的属性描述符的属性的名称。
返回值
如果属性存在于给定的目标对象中,则返回属性描述符;否则,返回 undefined。
Reflect.getOwnPropertyDescriptor({x: "hello"}, "x");
// {value: "hello", writable: true, enumerable: true, configurable: true}
七、Reflect.getPrototypeOf()
- target: 它原型的目标对象 >> 为了查找它的原型。
返回值
给定对象的原型。如果给定对象没有继承的属性,则返回 null。
Reflect.getPrototypeOf({}); // Object.prototype
Reflect.getPrototypeOf(Object.prototype); // null
Reflect.getPrototypeOf(Object.create(null)); // null