object.create(null) 创建的对象原型为 null,不继承任何内置方法,比 {} 更纯净;{} 等价于 object.create(object.prototype),可调用 tostring 等方法,而 object.create(null) 调用会报错,适用于哈希映射、配置容器等需完全可控的场景。

使用 Object.create(null) 是创建“绝对纯净”对象最直接的方式——它生成的对象没有继承自 Object.prototype,因此不带 toString、hasOwnProperty、constructor 等任何内置方法,原型链彻底中断,真正实现“空对象”。
为什么它比 {} 更“纯净”?
普通字面量 {} 实际等价于 Object.create(Object.prototype),其 __proto__ 指向 Object.prototype,所以能调用所有原型方法。而 Object.create(null) 的 __proto__ 为 null,查找不到任何属性或方法,连 obj.toString() 都会报 TypeError。
典型适用场景
-
用作哈希映射(map-like 结构):避免键名与原型方法冲突(如
"toString"、"hasOwnProperty"),无需额外防御性检查 - 实现自定义字典或配置容器:确保所有属性均为显式设置,无意外继承行为干扰
- 构建沙箱环境或元编程结构:需要完全可控的属性访问逻辑,比如 Proxy + null 原型对象组合
使用时需注意的关键细节
- 不能直接调用
obj.toString()、obj.hasOwnProperty(key)等方法,需改用Object.prototype.toString.call(obj)或Object.prototype.hasOwnProperty.call(obj, key) - JSON 序列化不受影响(
JSON.stringify({})和JSON.stringify(Object.create(null))行为一致),但反序列化后仍是普通对象,需手动转换 - 扩展运算符(
{...obj})和Object.assign可正常拷贝可枚举自有属性,但不会复制原型链(本来也没有) - ES6 Map 虽更规范,但在仅需字符串键、轻量级映射时,
Object.create(null)仍具性能与简洁优势
简单示例对比
```js
const normal = {};
const clean = Object.create(null);
console.log(normal.toString()); // "[object Object]"
console.log(clean.toString()); // TypeError: clean.toString is not a function
console.log('toString' in normal); // true
console.log('toString' in clean); // false
console.log(clean.__proto__); // null
```
不复杂但容易忽略:纯净 ≠ 万能,关键在按需选择——要方法便利选 {},要绝对可控选 Object.create(null)。










