handler.ownKeys()
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 handler.ownKeys() là một trap cho phương thức nội bộ [[OwnPropertyKeys]] của đối tượng, được sử dụng bởi các thao tác như Object.keys(), Reflect.ownKeys(), v.v.
Try it
const monster = {
_age: 111,
[Symbol("secret")]: "I am scared!",
eyeCount: 4,
};
const handler = {
ownKeys(target) {
return Reflect.ownKeys(target);
},
};
const proxy = new Proxy(monster, handler);
for (const key of Object.keys(proxy)) {
console.log(key);
// Expected output: "_age"
// Expected output: "eyeCount"
}
Cú pháp
new Proxy(target, {
ownKeys(target) {
}
})
Tham số
Tham số sau được truyền vào phương thức ownKeys(). this được gắn với handler.
target-
Đối tượng đích.
Giá trị trả về
Phương thức ownKeys() phải trả về một đối tượng giống mảng trong đó mỗi phần tử là String hoặc Symbol và không có phần tử trùng lặp.
Mô tả
>Các thao tác bị chặn
Trap này có thể chặn các thao tác sau:
Hoặc bất kỳ thao tác nào khác gọi đến phương thức nội bộ [[OwnPropertyKeys]].
Các bất biến
Phương thức nội bộ [[OwnPropertyKeys]] của proxy ném ra TypeError nếu định nghĩa handler vi phạm một trong các bất biến sau:
- Kết quả phải là một
Object. - Danh sách các key không được chứa giá trị trùng lặp.
- Kiểu của mỗi key phải là
StringhoặcSymbol. - Danh sách kết quả phải chứa các key của tất cả thuộc tính own non-configurable của đối tượng đích. Tức là, đối với tất cả các key được trả về bởi
Reflect.ownKeys()trên đối tượng đích, nếu key đó cóconfigurable: falsetheoReflect.getOwnPropertyDescriptor(), thì key đó phải có trong danh sách kết quả. - Nếu đối tượng đích không thể mở rộng (not extensible), thì danh sách kết quả phải chứa tất cả các key của các thuộc tính own của đối tượng đích và không có giá trị nào khác. Tức là, nếu
Reflect.isExtensible()trả vềfalsetrêntarget, thì danh sách kết quả phải chứa các giá trị giống hệt kết quả củaReflect.ownKeys()trêntarget.
Ví dụ
>Chặn getOwnPropertyNames
Đoạn code sau chặn Object.getOwnPropertyNames().
const p = new Proxy(
{},
{
ownKeys(target) {
console.log("called");
return ["a", "b", "c"];
},
},
);
console.log(Object.getOwnPropertyNames(p));
// "called"
// [ 'a', 'b', 'c' ]
Đoạn code sau vi phạm một bất biến.
const obj = {};
Object.defineProperty(obj, "a", {
configurable: false,
enumerable: true,
value: 10,
});
const p = new Proxy(obj, {
ownKeys(target) {
return [123, 12.5, true, false, undefined, null, {}, []];
},
});
console.log(Object.getOwnPropertyNames(p));
// TypeError: proxy [[OwnPropertyKeys]] must return an array
// with only string and symbol elements
Thông số kỹ thuật
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-proxy-object-internal-methods-and-internal-slots-ownpropertykeys> |