Proxy() 建構函式

Baseline 已廣泛支援

此特性已非常成熟,可在多種裝置和瀏覽器版本上使用。自 ⁨2016 年 9 月⁩以來,它已在各大瀏覽器中可用。

Proxy() 建構函式建立 Proxy 物件。

語法

js
new Proxy(target, handler)

注意: Proxy() 只能透過 new 來構造。嘗試不帶 new 呼叫它會丟擲 TypeError

引數

目標

要使用 Proxy 包裝的目標物件。它可以是任何型別的物件,包括原生陣列、函式,甚至是另一個代理。

handler

一個物件,其屬性是函式,這些函式定義了當對代理執行操作時代理的行為。

描述

使用 Proxy() 建構函式建立一個新的 Proxy 物件。此建構函式接受兩個必需引數:

  • target 是您要為其建立代理的物件。
  • handler 是定義代理自定義行為的物件。

一個空的 handler 將建立一個在幾乎所有方面都與目標物件完全相同的代理。透過在 handler 物件上定義一組特定的函式,您可以自定義代理行為的特定方面。例如,透過定義 get(),您可以提供目標物件 屬性訪問器 的自定義版本。

Handler 函式

本節列出了您可以定義的所有 handler 函式。Handler 函式有時被稱為 *trap*,因為它們會攔截對底層目標物件的呼叫。

handler.apply()

攔截函式呼叫的 trap。

handler.construct()

攔截 new 運算子的 trap。

handler.defineProperty()

攔截 Object.defineProperty 的 trap。

handler.deleteProperty()

攔截 delete 運算子的 trap。

handler.get()

攔截獲取屬性值的 trap。

handler.getOwnPropertyDescriptor()

攔截 Object.getOwnPropertyDescriptor 的 trap。

handler.getPrototypeOf()

攔截 Object.getPrototypeOf 的 trap。

handler.has()

攔截 in 運算子的 trap。

handler.isExtensible()

攔截 Object.isExtensible 的 trap。

handler.ownKeys()

攔截 Object.getOwnPropertyNamesObject.getOwnPropertySymbols 的 trap。

handler.preventExtensions()

攔截 Object.preventExtensions 的 trap。

handler.set()

攔截設定屬性值的 trap。

handler.setPrototypeOf()

攔截 Object.setPrototypeOf 的 trap。

示例

選擇性代理屬性訪問器

在此示例中,目標物件有兩個屬性:notProxiedproxied。我們定義了一個 handler,它為 proxied 返回不同的值,並允許其他所有訪問穿透到目標物件。

js
const target = {
  notProxied: "original value",
  proxied: "original value",
};

const handler = {
  get(target, prop, receiver) {
    if (prop === "proxied") {
      return "replaced value";
    }
    return Reflect.get(...arguments);
  },
};

const proxy = new Proxy(target, handler);

console.log(proxy.notProxied); // "original value"
console.log(proxy.proxied); // "replaced value"

規範

規範
ECMAScript® 2026 語言規範
# sec-proxy-constructor

瀏覽器相容性

另見