Reflect
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
Đối tượng namespace Reflect chứa các phương thức tĩnh để gọi các phương thức nội tại của đối tượng JavaScript có thể chặn. Các phương thức này giống với các phương thức của proxy handler.
Mô tả
Không giống hầu hết các đối tượng toàn cục khác, Reflect không phải là constructor. Bạn không thể dùng nó với toán tử new hay gọi đối tượng Reflect như một hàm. Tất cả các thuộc tính và phương thức của Reflect là tĩnh (giống như đối tượng Math).
Đối tượng Reflect cung cấp một tập hợp các hàm tĩnh có cùng tên với các phương thức proxy handler.
Trường hợp sử dụng chính của Reflect là cung cấp hành vi chuyển tiếp mặc định trong các trap handler của Proxy. Một trap được dùng để chặn một thao tác trên một đối tượng — nó cung cấp một triển khai tùy chỉnh cho một phương thức nội tại của đối tượng. API Reflect được dùng để gọi phương thức nội tại tương ứng. Ví dụ, code bên dưới tạo một proxy p với trap deleteProperty chặn phương thức nội tại [[Delete]]. Reflect.deleteProperty() được dùng để gọi hành vi [[Delete]] mặc định trên targetObject trực tiếp. Bạn có thể thay thế nó bằng delete, nhưng dùng Reflect giúp bạn không phải nhớ cú pháp mà mỗi phương thức nội tại tương ứng với.
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);
},
},
);
Các phương thức Reflect cũng cho phép kiểm soát tốt hơn cách phương thức nội tại được gọi. Ví dụ, Reflect.construct() là cách duy nhất để xây dựng một hàm target với một giá trị new.target cụ thể. Nếu bạn dùng toán tử new để gọi một hàm, giá trị new.target luôn là chính hàm đó. Điều này có các hiệu ứng quan trọng với subclassing. Ví dụ khác, Reflect.get() cho phép bạn chạy một getter với giá trị this tùy chỉnh, trong khi các accessor thuộc tính luôn dùng đối tượng hiện tại làm giá trị this.
Hầu hết hành vi của mỗi phương thức Reflect đều có thể thực hiện bằng một số cú pháp hoặc phương thức khác. Một số phương thức này có các phương thức tĩnh tương ứng cùng tên trên Object, mặc dù chúng có một số khác biệt nhỏ. Để biết sự khác biệt chính xác, hãy xem mô tả cho từng phương thức Reflect.
Thuộc tính tĩnh
Reflect[Symbol.toStringTag]-
Giá trị khởi đầu của thuộc tính
[Symbol.toStringTag]là chuỗi"Reflect". Thuộc tính này được dùng trongObject.prototype.toString().
Phương thức tĩnh
Reflect.apply()-
Gọi một hàm
targetvới các đối số được chỉ định bởi tham sốargumentsList. Xem thêmFunction.prototype.apply(). Reflect.construct()-
Toán tử
newdưới dạng hàm. Tương đương với việc gọinew target(...argumentsList). Cũng cung cấp tùy chọn để chỉ định một prototype khác. Reflect.defineProperty()-
Tương tự
Object.defineProperty(). Trả về một boolean làtruenếu thuộc tính được định nghĩa thành công. Reflect.deleteProperty()-
Toán tử
deletedưới dạng hàm. Tương đương với việc gọidelete target[propertyKey]. Reflect.get()-
Trả về giá trị của thuộc tính. Hoạt động như việc lấy một thuộc tính từ một đối tượng (
target[propertyKey]) dưới dạng hàm. Reflect.getOwnPropertyDescriptor()-
Tương tự
Object.getOwnPropertyDescriptor(). Trả về property descriptor của thuộc tính đã cho nếu nó tồn tại trên đối tượng,undefinednếu không. Reflect.getPrototypeOf()-
Giống
Object.getPrototypeOf(). Reflect.has()-
Trả về một boolean cho biết target có thuộc tính đó không. Bao gồm cả thuộc tính riêng hoặc kế thừa. Hoạt động như toán tử
indưới dạng hàm. Reflect.isExtensible()-
Giống
Object.isExtensible(). Trả về một boolean làtruenếu target có thể mở rộng. Reflect.ownKeys()-
Trả về một mảng các key thuộc tính riêng (không kế thừa) của đối tượng target.
Reflect.preventExtensions()-
Tương tự
Object.preventExtensions(). Trả về một boolean làtruenếu cập nhật thành công. Reflect.set()-
Một hàm gán giá trị cho các thuộc tính. Trả về một boolean là
truenếu cập nhật thành công. Reflect.setPrototypeOf()-
Một hàm thiết lập prototype của một đối tượng. Trả về một boolean là
truenếu cập nhật thành công.
Ví dụ
>Phát hiện xem một đối tượng có chứa thuộc tính nhất định không
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
Trả về các key riêng của đối tượng
Reflect.ownKeys(duck);
// [ "name", "color", "greeting" ]
Thêm một thuộc tính mới vào đối tượng
Reflect.set(duck, "eyes", "black");
// returns "true" if successful
// "duck" now contains the property "eyes: 'black'"
Đặc tả kỹ thuật
| Thông số kỹ thuật |
|---|
| ECMAScript® 2027 Language Specification> # sec-reflect-object> |