JavaScript: JavaScript Reflection
Reflection là gì
Reflect.construct()
– hoạt động như toán tử new, nhưng như một hàm. Nó tương đương với việc gọinew target(...args)
.Reflect.defineProperty()
– tương tự nhưObject.defineProperty()
, nhưng trả về giá trị Boolean cho biết thuộc tính có được xác định thành công trên đối tượng hay không.Reflect.deleteProperty()
– hoạt động như toán tử delete, nhưng như một hàm. Tương đương với việc gọidelete objectName[propertyName]
.Reflect.get()
– trả về giá trị của một thuộc tính.Reflect.getOwnPropertyDescriptor()
– tương tự nhưObject.getOwnPropertyDescriptor()
. Nó trả về một mô tả thuộc tính của một thuộc tính nếu thuộc tính đó tồn tại trên đối tượng hoặcundefined
nếu ngược lại.Reflect.getPrototypeOf()
– giống nhưObject.getPrototypeOf()
.Reflect.has()
– hoạt động nhưin
toán tử, nhưng như một hàm. Nó trả về giá trị boolean cho biết liệu một thuộc tính (sở hữu hoặc thừa kế) có tồn tại hay không.
Reflect.isExtensible()
– giống nhưObject.isExtensible()
.Reflect.ownKeys()
– trả về một mảng các khóa thuộc tính được sở hữu (không được kế thừa) của một đối tượng.Reflect.preventExtensions()
– tương tự nhưObject.preventExtensions()
. Nó trả về một Boolean.Reflect.set()
– gán giá trị cho thuộc tính và trả về giá trị Boolean, giá trị này là true nếu thuộc tính được thiết lập thành công.Reflect.setPrototypeOf()
– thiết lập nguyên mẫu của đối tượng
Ví dụ
Tạo đối tượng: Reflect.construct()
Phương thức Reflect.construct()
hoạt động giống như toán tử new, nhưng là một hàm. Nó tương đương với việc gọi the new target(...args)
với khả năng chỉ định một nguyên mẫu khác:
Reflect.construct(target, args [, newTarget])
Phương thức Reflect.construct()
trả về thể hiện mới của đối tượng target
, hoặc newTarget
nếu được chỉ định, được khởi tạo bởi target
như một hàm khởi tạo với đối tượng dạng mảng args
được cung cấp. Xem ví dụ sau:
class Person { constructor(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } get fullName() { return `${this.firstName} ${this.lastName}`; } }; let args = ['John', 'Doe']; let john = Reflect.construct( Person, args ); console.log(john instanceof Person); console.log(john.fullName); // John Doe
Output
true John Doe
Trong ví dụ này:
- Đầu tiên, định nghĩa một lớp có tên là
Person
. - Thứ hai, khai báo một mảng args chứa hai chuỗi.
- Thứ ba, tạo một thể hiện mới của lớp Person bằng phương thức Reflect.construct(). Đối tượng john là một thể hiện của lớp Person nên có thuộc tính fullName.
Gọi một hàm: Reflect.apply()
Trước ES6, bạn gọi một hàm với giá trị this được chỉ định và arguments
bằng cách sử dụng phương thức Function.prototype.apply()
. Ví dụ:
let result = Function.prototype.apply.call(Math.max, Math, [10, 20, 30]); console.log(result);
Output
30
Reflect.apply() cung cấp các tính năng tương tự như Function.prototype.apply()
nhưng ít dài dòng hơn và dễ hiểu hơn:
let result = Reflect.apply(Math.max, Math, [10, 20, 30]); console.log(result);
Sau đây là cú pháp của phương thức Reflect.apply():
Reflect.apply(target, thisArg, args)
Định nghĩa một thuộc tính:Reflect.defineProperty()
Reflect.defineProperty()
giống như Object.defineProperty()
. Tuy nhiên, nó trả về Boolean cho biết thuộc tính đã được định nghĩa thành công hay chưa thay vì đưa ra ngoại lệ:
Reflect.defineProperty(target, propertyName, propertyDescriptor)
Xem ví dụ sau:
let person = { name: 'John Doe' }; if (Reflect.defineProperty(person, 'age', { writable: true, configurable: true, enumerable: false, value: 25, })) { console.log(person.age); } else { console.log('Cannot define the age property on the person object.'); }