Proxy的“伴生对象”—— Reflect

0 阅读3分钟

相关链接

Reflect - JavaScript | MDN

代码地址

Reflect 静态方法

  • 属性访问相关

    • Reflect.get(target, propertyKey[, receiver]) :获取对象 target 上属性 propertyKey 的值,类似 target[propertyKey] 。如果提供 receiver ,且 target 的属性是一个 getter 函数 ,则 receiver 会作为函数运行时的 this 值。
let obj = { x: 1, y: 2 };
console.log(Reflect.get(obj, 'x')); // 输出 1
  • Reflect.set(target, propertyKey, value[, receiver]) :设置对象 target 上属性 propertyKey 的值为 value,类似 target[propertyKey] = value。如果设置成功返回 true,失败返回 false。当 target 和 receiver 不同时,会使用 target 的属性描述符(查找 setter 或判断属性是否可写),但在 receiver 上设置属性 。
let obj = {};
console.log(Reflect.set(obj, 'name', 'Alice')); // 输出 true
  • Reflect.has(target, propertyKey)  :判断对象 target 是否存在属性 propertyKey,和 in 运算符功能相同,返回 true 或 false
let obj = { x: 1 };
console.log(Reflect.has(obj, 'x')); // 输出 true
  • 函数调用相关

    • Reflect.apply(target, thisArgument, argumentsList) :对函数 target 进行调用,thisArgument 作为函数执行时的 this 值,argumentsList 是参数数组,和 Function.prototype.apply() 功能类似。
function add(a, b) {
    return a + b;
}
console.log(Reflect.apply(add, null, [1, 2])); // 输出 3
  • Reflect.construct(target, argumentsList[, newTarget]) :对构造函数 target 进行 new 操作,相当于执行 new target(...argumentsList),可指定 newTarget 来确定最终实例的原型。
function Person(name) {
    this.name = name;
}
let alice = Reflect.construct(Person, ['Alice']);
console.log(alice.name); // 输出 Alice
  • 属性定义与删除相关

    • Reflect.defineProperty(target, propertyKey, attributes) :和 Object.defineProperty() 类似,用于定义或修改对象 target 上属性 propertyKey 的描述符 attributes,设置成功返回 true,否则返回 false
let obj = {};
console.log(Reflect.defineProperty(obj, 'name', {
    value: 'Bob',
    writable: false
})); // 输出 true
  • Reflect.deleteProperty(target, propertyKey) :作为函数形式的 delete 操作符,删除对象 target 上的属性 propertyKey,成功返回 true,失败返回 false
let obj = { x: 1 };
console.log(Reflect.deleteProperty(obj, 'x')); // 输出 true
  • 原型与描述符相关

    • Reflect.getPrototypeOf(target) :类似于 Object.getPrototypeOf(),返回对象 target 的原型。
    • Reflect.setPrototypeOf(target, prototype) :设置对象 target 的原型为 prototype,设置成功返回 true,失败返回 false
    • Reflect.getOwnPropertyDescriptor(target, propertyKey) :类似于 Object.getOwnPropertyDescriptor() ,如果对象 target 中存在属性 propertyKey,则返回对应的属性描述符,否则返回 undefined
  • 其他

    • Reflect.isExtensible(target) :类似于 Object.isExtensible(),判断对象 target 是否可扩展(是否可以添加新属性)。
    • Reflect.preventExtensions(target) :阻止向对象 target 添加新属性,返回一个布尔值表示操作是否成功。
    • Reflect.ownKeys(target) :返回一个包含对象 target 所有自身属性(不包含继承属性)的数组,不受属性 enumerable 特性影响。

handler 对象方法(与 Reflect 静态方法对应)

在使用 Proxy 时,handler 对象是用于定义代理行为的配置对象,其方法与 Reflect 的静态方法命名相同,功能也类似,用于拦截对象的各种操作:

  • handler.get(target, propertyKey, receiver) :拦截对象属性的读取操作,和 Reflect.get 类似,参数意义相同。
  • handler.set(target, propertyKey, value, receiver) :拦截对象属性的设置操作,对应 Reflect.set 。
  • handler.has(target, propertyKey) :拦截 in 操作符,对应 Reflect.has 。
  • handler.apply(target, thisArgument, argumentsList) :拦截函数调用,对应 Reflect.apply 。
  • handler.construct(target, argumentsList, newTarget) :拦截 new 操作,对应 Reflect.construct 。
  • handler.defineProperty(target, propertyKey, attributes) :拦截对象属性的定义操作,对应 Reflect.defineProperty 。
  • handler.deleteProperty(target, propertyKey) :拦截 delete 操作,对应 Reflect.deleteProperty 。
  • handler.getPrototypeOf(target) :拦截获取对象原型的操作,对应 Reflect.getPrototypeOf 。
  • handler.setPrototypeOf(target, prototype) :拦截设置对象原型的操作,对应 Reflect.setPrototypeOf 。
  • handler.getOwnPropertyDescriptor(target, propertyKey) :拦截获取对象属性描述符的操作,对应 Reflect.getOwnPropertyDescriptor 。
  • handler.isExtensible(target) :拦截判断对象是否可扩展的操作,对应 Reflect.isExtensible 。
  • handler.preventExtensions(target) :拦截阻止对象扩展的操作,对应 Reflect.preventExtensions 。
  • handler.ownKeys(target) :拦截获取对象自身属性键的操作,对应 Reflect.ownKeys 。