Object.create(null)是唯一可靠方式,因其直接切断原型链使对象真正“一无所有”,而{}或new Object()创建的对象仍继承Object.prototype的方法,手动删除或修改__proto__均不可靠。

用 Object.create(null) 就行。它直接切断原型链,生成的对象连 toString、hasOwnProperty、constructor 都没有,真正“一无所有”。
为什么 Object.create(null) 是唯一可靠方式
普通写法如 {} 或 new Object() 创建的对象,原型指向 Object.prototype,天然携带一堆方法;而 Object.create(null) 的 __proto__ 是 null,查属性时一步就断,不会向上找。
-
Object.getPrototypeOf({}) === Object.prototype→true -
Object.getPrototypeOf(Object.create(null)) === null→true -
{}.toString返回函数;Object.create(null).toString是undefined
不能靠删方法来“净化”对象
有人想先用 {} 再手动删掉 toString 等——这没用。这些方法在原型上,不是对象自身的属性,delete obj.toString 不生效,且后续访问仍会从原型链取值。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 设置
obj.__proto__ = null在严格模式下报错,非严格模式也不稳定 - 用
Object.setPrototypeOf(obj, null)可行但开销大,且已有属性可能已被污染 - 只有从源头切断,才真正干净
典型使用场景
需要完全可控的键值容器时,Object.create(null) 是首选。
- 哈希映射(比如实现 Map 的简易版):避免
"toString"这类 key 被原型方法拦截 - 事件监听器存储:防止用户注册的事件名与内置方法同名导致覆盖或异常
- 配置合并或 schema 校验上下文:杜绝原型链干扰属性判断逻辑
注意它的副作用
纯净是有代价的,得自己补基础能力。
-
obj instanceof Object返回false - 不能直接调用
Object.keys(obj)?可以,它只依赖对象可枚举属性,不依赖原型方法 - 想用
hasOwnProperty?得换写法:Object.prototype.hasOwnProperty.call(obj, key)或改用Object.hasOwn(obj, key)(ES2022+)

















