Reflect

Baseline 已廣泛支援

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

Reflect 名稱空間物件包含用於呼叫可攔截的 JavaScript 物件內部方法的靜態方法。這些方法與 Proxy 處理器 的方法相同。

描述

與大多數全域性物件不同,Reflect 不是一個建構函式。您不能使用 new 運算子 來使用它,也不能將 Reflect 物件作為函式呼叫。Reflect 的所有屬性和方法都是靜態的(就像 Math 物件一樣)。

Reflect 物件提供了一系列靜態函式,它們的名稱與 Proxy 處理器方法 相同。

Reflect 的主要用例是在 Proxy 處理器陷阱中提供預設的轉發行為。 陷阱 用於攔截物件上的操作——它為 物件內部方法 提供了自定義實現。Reflect API 用於呼叫相應的內部方法。例如,下面的程式碼建立一個具有 deleteProperty 陷阱的代理 p,該陷阱攔截 [[Delete]] 內部方法。Reflect.deleteProperty() 用於直接呼叫 targetObject 上的預設 [[Delete]] 行為。您可以將其替換為 delete,但使用 Reflect 可以避免您記住每個內部方法對應的語法。

js
const p = new Proxy(
  {},
  {
    deleteProperty(targetObject, property) {
      // Custom functionality: log the deletion
      console.log("Deleting property:", property);

      // Execute the default introspection behavior
      return Reflect.deleteProperty(targetObject, property);
    },
  },
);

Reflect 方法還允許對內部方法的呼叫方式進行更精細地控制。例如,Reflect.construct() 是使用特定的 new.target 值來構造目標函式的唯一方法。如果您使用 new 運算子 呼叫函式,new.target 的值始終是函式本身。這對於 子類繼承 有重要影響。作為另一個例子,Reflect.get() 允許您使用自定義的 this 值來執行 getter,而 屬性訪問器 始終使用當前物件作為 this 值。

幾乎每個 Reflect 方法的行為都可以透過其他語法或方法來實現。其中一些方法在 Object 上有同名的對應靜態方法,儘管它們之間存在一些細微的差別。確切的差異請參閱每個 Reflect 方法的描述。

靜態屬性

Reflect[Symbol.toStringTag]

[Symbol.toStringTag] 屬性的初始值是字串 "Reflect"。此屬性用於 Object.prototype.toString()

靜態方法

Reflect.apply()

使用 argumentsList 引數指定的引數呼叫 target 函式。另請參閱 Function.prototype.apply()

Reflect.construct()

new 運算子 作為函式。等同於呼叫 new target(...argumentsList)。還提供了指定不同原型的選項。

Reflect.defineProperty()

類似於 Object.defineProperty()。如果屬性已成功定義,則返回布林值 true

Reflect.deleteProperty()

delete 運算子 作為函式。等同於呼叫 delete target[propertyKey]

Reflect.get()

返回屬性的值。像從物件中獲取屬性(target[propertyKey])一樣作為一個函式工作。

Reflect.getOwnPropertyDescriptor()

類似於 Object.getOwnPropertyDescriptor()。如果屬性存在於物件上,則返回給定屬性的屬性描述符,否則返回 undefined

Reflect.getPrototypeOf()

Object.getPrototypeOf() 相同。

Reflect.has()

返回一個布林值,指示目標是否具有該屬性。無論是自有屬性還是繼承屬性。像 in 運算子 作為函式一樣工作。

Reflect.isExtensible()

Object.isExtensible() 相同。如果目標是可擴充套件的,則返回布林值 true

Reflect.ownKeys()

返回目標物件自身的(非繼承的)屬性鍵的陣列。

Reflect.preventExtensions()

類似於 Object.preventExtensions()。如果更新成功,則返回布林值 true

Reflect.set()

一個用於為屬性賦值的函式。如果更新成功,則返回布林值 true

Reflect.setPrototypeOf()

一個用於設定物件原型的函式。如果更新成功,則返回布林值 true

示例

檢測物件是否包含某些屬性

js
const duck = {
  name: "Maurice",
  color: "white",
  greeting() {
    console.log(`Quaaaack! My name is ${this.name}`);
  },
};

Reflect.has(duck, "color");
// true
Reflect.has(duck, "haircut");
// false

返回物件的自有鍵

js
Reflect.ownKeys(duck);
// [ "name", "color", "greeting" ]

向物件新增新屬性

js
Reflect.set(duck, "eyes", "black");
// returns "true" if successful
// "duck" now contains the property "eyes: 'black'"

規範

規範
ECMAScript® 2026 語言規範
# sec-reflect-object

瀏覽器相容性

另見