描述
與大多數全域性物件不同,Reflect 不是一個建構函式。您不能使用 new 運算子 來使用它,也不能將 Reflect 物件作為函式呼叫。Reflect 的所有屬性和方法都是靜態的(就像 Math 物件一樣)。
Reflect 物件提供了一系列靜態函式,它們的名稱與 Proxy 處理器方法 相同。
Reflect 的主要用例是在 Proxy 處理器陷阱中提供預設的轉發行為。 陷阱 用於攔截物件上的操作——它為 物件內部方法 提供了自定義實現。Reflect API 用於呼叫相應的內部方法。例如,下面的程式碼建立一個具有 deleteProperty 陷阱的代理 p,該陷阱攔截 [[Delete]] 內部方法。Reflect.deleteProperty() 用於直接呼叫 targetObject 上的預設 [[Delete]] 行為。您可以將其替換為 delete,但使用 Reflect 可以避免您記住每個內部方法對應的語法。
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。
示例
檢測物件是否包含某些屬性
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
返回物件的自有鍵
Reflect.ownKeys(duck);
// [ "name", "color", "greeting" ]
向物件新增新屬性
Reflect.set(duck, "eyes", "black");
// returns "true" if successful
// "duck" now contains the property "eyes: 'black'"
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-reflect-object |
瀏覽器相容性
載入中…