Reflect.defineProperty()
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.
Phương thức tĩnh Reflect.defineProperty() giống như Object.defineProperty() nhưng trả về một Boolean.
Try it
const object = {};
if (Reflect.defineProperty(object, "foo", { value: 42 })) {
console.log("foo created!");
// Expected output: "foo created!"
} else {
console.log("problem creating foo");
}
console.log(object.foo);
// Expected output: 42
Cú pháp
Reflect.defineProperty(target, propertyKey, attributes)
Tham số
target-
Đối tượng target trên đó định nghĩa thuộc tính.
propertyKey-
Tên của thuộc tính cần được định nghĩa hoặc sửa đổi.
attributes-
Các thuộc tính cho thuộc tính đang được định nghĩa hoặc sửa đổi.
Giá trị trả về
Một boolean cho biết thuộc tính có được định nghĩa thành công hay không.
Ngoại lệ
TypeError-
Được ném ra nếu
targethoặcattributeskhông phải là đối tượng.
Mô tả
Reflect.defineProperty() cung cấp ngữ nghĩa phản chiếu của việc định nghĩa thuộc tính riêng trên một đối tượng. Ở mức độ rất thấp, việc định nghĩa thuộc tính trả về một boolean (như trường hợp của proxy handler). Object.defineProperty() cung cấp ngữ nghĩa gần như giống nhau, nhưng nó ném ra TypeError nếu trạng thái là false (thao tác không thành công), trong khi Reflect.defineProperty() trả về trực tiếp trạng thái đó.
Nhiều thao tác tích hợp cũng định nghĩa thuộc tính riêng trên các đối tượng. Sự khác biệt quan trọng nhất giữa việc định nghĩa thuộc tính và thiết lập chúng là các setter không được gọi. Ví dụ, các trường lớp định nghĩa trực tiếp thuộc tính trên instance mà không gọi setter.
class B extends class A {
set a(v) {
console.log("Setter called");
}
} {
a = 1; // Nothing logged
}
Reflect.defineProperty() gọi phương thức nội tại [[DefineOwnProperty]] của đối tượng trên target.
Ví dụ
>Sử dụng Reflect.defineProperty()
const obj = {};
Reflect.defineProperty(obj, "x", { value: 7 }); // true
console.log(obj.x); // 7
Kiểm tra xem việc định nghĩa thuộc tính có thành công không
Với Object.defineProperty(), trả về một đối tượng nếu thành công, hoặc ném ra TypeError nếu không, bạn sẽ dùng khối try...catch để bắt bất kỳ lỗi nào xảy ra trong khi định nghĩa thuộc tính.
Vì Reflect.defineProperty() trả về trạng thái thành công dạng Boolean, bạn chỉ cần dùng khối if...else ở đây:
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
Đặc tả kỹ thuật
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-reflect.defineproperty> |