handler.get()

handler.get() 方法是 [[Get]] 对象内部方法 的一个陷阱,它用于诸如 属性访问器 之类的操作。

试一试

语法

js
new Proxy(target, {
  get(target, property, receiver) {
  }
})

参数

以下参数传递给 get() 方法。this 绑定到处理程序。

target

目标对象。

property

表示属性名称的字符串或 Symbol

receiver

getter 的 this 值;请参阅 Reflect.get()。这通常是代理本身或从代理继承的对象。

返回值

get() 方法可以返回任何值,表示属性值。

描述

拦截

此陷阱可以拦截以下操作

或任何其他调用 [[Get]] 内部方法 的操作。

不变式

如果处理程序定义违反以下不变式之一,则代理的 [[Get]] 内部方法会抛出一个 TypeError

  • 如果目标对象属性是非可写、非可配置的自有数据属性,则报告的属性值必须与相应目标对象属性的值相同。也就是说,如果 Reflect.getOwnPropertyDescriptor() 返回 target 上属性的 configurable: false, writable: false,则陷阱必须返回与 target 属性描述符中的 value 属性相同的值。
  • 如果相应目标对象属性是非可配置的自有访问器属性,并且具有未定义的 getter,则报告的属性值必须为 undefined。也就是说,如果 Reflect.getOwnPropertyDescriptor() 返回 target 上属性的 configurable: false, get: undefined,则陷阱必须返回 undefined

示例

获取属性值的陷阱

以下代码捕获获取属性值的操作。

js
const p = new Proxy(
  {},
  {
    get(target, property, receiver) {
      console.log(`called: ${property}`);
      return 10;
    },
  },
);

console.log(p.a);
// "called: a"
// 10

以下代码违反了不变式。

js
const obj = {};
Object.defineProperty(obj, "a", {
  configurable: false,
  enumerable: false,
  value: 10,
  writable: false,
});

const p = new Proxy(obj, {
  get(target, property) {
    return 20;
  },
});

p.a; // TypeError is thrown

规范

规范
ECMAScript 语言规范
# sec-proxy-object-internal-methods-and-internal-slots-get-p-receiver

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅