Reflect.ownKeys结合数组过滤实现对象私密属性精准销毁
通过反射机制获取对象所有自身属性键(包括不可枚举和符号键),利用数组定义的黑名单或白名单,逐个遍历这些键并执行删除操作或将其赋值为未定义,从而实现敏感属性的精准销毁,并支持对不可配置属性进行降级处理。
先澄清一点:Reflect.ownKeys 本身并不负责“销毁”属性,它的职责是枚举对象自身的所有键——包括不可枚举和 Symbol 键。要真正删除属性,仍需借助 delete 运算符或将属性值赋为 undefined。而数组过滤在此充当“声明者”角色:通过白名单或黑名单定义敏感字段,再结合 Reflect.ownKeys 获取全部自有键,进行交集或排除,最终精准定位并清理目标属性。
下面一步步拆解这个流程。
明确敏感字段列表,通过数组定义白名单或黑名单
第一步,先把需要销毁的敏感属性名整理出来。例如常见的 "password"、"token"、"idCard",甚至可能包含 Symbol("session")。将这些名称存储为字符串或 Symbol 类型的数组。特别注意:Symbol 键必须使用原始的 Symbol 实例,不能通过 Symbol("xxx") 临时生成——因为每次调用都会创建新的 Symbol,无法匹配。
- 黑名单模式(销毁指定字段):
blacklist = ["password", "token", Symbol.for("auth")]; - 白名单模式(仅保留指定字段):
whitelist = ["id", "name", "email"];// 其余全部删除
用 Reflect.ownKeys 获取全部自有键,包含不可枚举与 Symbol 键
Reflect.ownKeys(obj) 返回一个数组,包含了对象所有自有属性的键。其顺序为:先按整数索引升序(对类数组对象也适用),然后按字符串键的创建顺序,最后是 Symbol 键。相较于 Object.keys() 或 Object.getOwnPropertyNames(),Reflect.ownKeys 更加全面——能够捕获通过 Object.defineProperty 设置的不可枚举属性,以及 Symbol 属性。
举个例子:
const user = { name: "Alice" };
Object.defineProperty(user, "password", { value: "123", enumerable: false });
user[Symbol("token")] = "abc";
Reflect.ownKeys(user); // ["name", "password", Symbol(token)]你看,password 虽不可枚举,Symbol("token") 虽是 Symbol,却无一遗漏。
遍历所有键并执行精准删除
获取全部键后,逐个判断是否属于敏感列表。若是,则通过 delete obj[key] 移除。这里有一个需要注意的地方:如果属性是不可配置的(configurable: false),delete 会静默失败(严格模式下会抛错)。此时,可以将属性值赋为 undefined 或 null,作为逻辑上的“销毁”。
- 黑名单方式(推荐):遍历
Reflect.ownKeys返回的键,判断每个 key 是否存在于 blacklist 中,若是则执行 delete。 - 白名单方式:先提取 whitelist 中实际存在的键,再遍历所有 ownKeys,不在 whitelist 中的都 delete。
- Symbol 匹配需确保引用一致:使用
Symbol.for("key")注册全局 Symbol,或直接复用定义时的 Symbol 常量。
封装成可复用的安全清理函数
最后,将上述逻辑封装成一个函数,支持传入目标对象和敏感字段数组,还可扩展配置项(如是否启用严格模式),以提高复用性和健壮性。
function scrubSensitive(obj, sensitiveKeys) {
if (typeof obj !== 'object' || obj === null) return obj;
const keys = Reflect.ownKeys(obj);
for (const key of keys) {
if (sensitiveKeys.some(s =>
(typeof s === 'symbol' && s === key) ||
(typeof s === 'string' && s === key)
)) {
try {
delete obj[key];
} catch (e) {
obj[key] = undefined; // fallback for non-configurable props
}
}
}
return obj;
}
// 使用示例
const data = { name: "Bob", password: "x", [Symbol("api")]: "secret" };
scrubSensitive(data, ["password", Symbol.for("api")]);如此一来,无论对象中包含多少不可枚举、Symbol 或不可配置的属性,都能精准按需清理,且不影响其他正常字段。再次强调:Reflect.ownKeys 只负责枚举属性,真正的“销毁”仍需通过 delete 或赋值为 undefined 实现,两者配合才能打出漂亮的组合拳。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
用Object.getPrototypeOf动态检测前端灰度发布组件白名单
Object getPrototypeOf作为原型校验器,在白名单机制中验证组件实例的直接原型是否合法。白名单为构造函数prototype对象的强引用快照,需在第三方脚本前采集。校验失败后按灰度策略分级响应,并配合冻结原型链、拦截篡改入口等防御措施。
箭头函数在定时器中的应用实例
箭头函数在定时器回调中自动继承外层this,避免了传统函数this指向全局或undefined的问题,无需手动bind或保存闭包变量。但其无法改变this指向,且没有arguments对象,也不能用作构造器。使用时应理解词法作用域与执行上下文的区别。
JavaScript原型式继承写法与应用场景详解
原型式继承通过Object create()以现有对象为模板创建新对象,实现行为复用而非数据复制。适用于配置派生、游戏实体等轻量场景,但需注意引用类型共享、无法传参初始化及类型识别失效等限制。
JavaScript对象字面量writable属性的默认配置机制完全解析
对象字面量中属性描述符默认全部开启,writable为true可直接赋值修改;而Object defineProperty定义的属性,writable、configurable、enumerable均默认为false,需手动设为true才能修改或枚举。两者默认行为差异显著。
JavaScript浮点数比较布尔值逻辑错误避免方法
JavaScript浮点数采用IEEE754双精度标准,二进制存储导致小数运算精度损失,直接使用`==`或`===`比较常出现逻辑错误。通常引入容差比较,如`Math abs(a-b)
- 热门数据榜
相关攻略
2026-07-14 07:06
2026-07-14 07:06
2026-07-14 07:05
2026-07-14 07:05
2026-07-14 07:05
2026-07-14 07:05
2026-07-14 07:05
2026-07-14 07:04
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

