Object.create(null) 创建的对象没有 proto 且不继承 Object.prototype 方法,是真正“空”的对象,适合键值映射或隔离作用域;它避免属性名冲突、枚举干扰和 in 操作符误判,需用 Object.prototype 方法显式调用,常用于哈希表、防原型污染配置、私有命名空间等场景。

用 Object.create(null) 创建的对象没有 __proto__,也不继承 Object.prototype 上的任何方法(比如 toString()、hasOwnProperty()、isPrototypeOf() 等),因此它是一个真正“空”的对象,适合用作纯粹的键值映射或隔离作用域。
为什么需要 Object.create(null)
普通对象字面量 {} 或 new Object() 都以 Object.prototype 为原型,这意味着:
- 所有属性名可能与原型方法冲突(例如你存一个
toString: "hello",调用obj.toString()会返回字符串而非原生方法); - 遍历时会意外枚举出原型上的属性(除非用
hasOwnProperty过滤); - 无法安全地用
in操作符判断自有属性(因为"toString" in obj会返回true)。
Object.create(null) 彻底切断原型链,避免这些干扰。
创建后怎么安全使用
由于没有原型方法,不能直接调用 obj.toString() 或 obj.hasOwnProperty()。需改用全局工具函数或显式绑定:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 检测属性存在:用
Object.prototype.hasOwnProperty.call(obj, key); - 获取属性描述符:用
Object.getOwnPropertyDescriptor(obj, key); - 遍历自有属性:用
Object.keys(obj)、Object.entries(obj)(它们内部不依赖对象自身原型); - 注意:
for...in仍可遍历(因为没原型,所以只遍历自有属性),但推荐优先用Object.keys()更明确。
典型适用场景
这类“纯净对象”常见于以下情况:
- 哈希表 / 字符串映射:如解析 URL 参数、构建词频统计、缓存 key-value 数据;
- 避免原型污染的配置对象:尤其在处理不受信输入(如 JSON 解析结果)时,防止恶意键名覆盖原型方法;
- 实现私有命名空间:比如插件系统中隔离不同模块的标识符,确保不会和内置方法重名;
- ES6 Map 的轻量替代(当不需要迭代顺序或复杂操作,且 key 全是字符串时)。
对比 {} 和 Object.create(null)
简单验证:
const plain = {};
const clean = Object.create(null);
console.log(plain.toString); // function toString() { ... }
console.log(clean.toString); // undefined
console.log('toString' in plain); // true
console.log('toString' in clean); // false
console.log(plain instanceof Object); // true
console.log(clean instanceof Object); // false(甚至不是 Object 实例)
这种差异让 Object.create(null) 在需要严格控制属性访问的底层逻辑中更可靠。

















