Reflect的属性及用法

947 阅读2分钟

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