ownKeys 拦截 Object.keys()、Object.getOwnPropertyNames()、Reflect.ownKeys()、for...in 循环及 JSON.stringify() 的键提取,必须返回字符串或 Symbol 数组,且须包含所有不可配置自有属性,否则报错。

Proxy 通过 ownKeys 拦截器控制对象的属性遍历行为,它不决定属性是否存在或能否访问,只决定哪些键名在遍历时“被看到”。
ownKeys 拦截哪些操作?
该 trap 影响所有返回对象键名列表的操作:
-
Object.keys()和Object.getOwnPropertyNames() Reflect.ownKeys()-
for...in循环(配合hasOwnProperty判断时) -
JSON.stringify()序列化时的键提取阶段(但不影响最终值)
基本写法与返回要求
handler 中定义 ownKeys(target),必须返回一个数组,且每个元素只能是字符串或 Symbol:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 数组内容即为“对外暴露的自有属性键”,哪怕目标对象实际没有该属性,只要写进数组,
for...in就会遍历到它(但读取时仍可能undefined) - 必须包含所有不可配置(non-configurable)的自有属性键,否则会抛出 TypeError
- 推荐用
Reflect.ownKeys(target)获取原始键,再做筛选或补充
常见实用场景
借助 ownKeys,可实现轻量级数据过滤和语义控制:
-
隐藏私有字段:过滤掉下划线开头的属性(如
_id、_temp),让Object.keys(proxy)不显示它们 - 按权限动态过滤:结合当前用户角色,只返回允许查看的字段名
-
注入虚拟键:在返回数组中额外加入计算属性名(如
'fullName'),再配合gettrap 提供逻辑实现 -
屏蔽敏感字段:对
token、password等字段,在遍历时“隐身”,避免被for...in或日志工具意外暴露
注意它不能做什么
ownKeys 是“可见性开关”,不是“访问闸门”:
- 即使某个键没出现在
ownKeys返回的数组里,仍可通过proxy.keyName直接读写 - 不影响
in操作符——那是hastrap 的职责 - 不干预
Object.getOwnPropertyDescriptor()的行为,除非你同时实现getOwnPropertyDescriptor -
JSON.stringify(proxy)仍可能序列化出被隐藏的属性,因它不依赖 ownKeys,而是直接读值

















