object.create(null) 创建的是内部[[prototype]]为null、无__proto__和constructor的完全空白对象,不继承任何方法,常用于避免原型污染的纯字典场景。

调用 Object.create(null) 时,并不是“丢弃”了默认原型,而是**根本没设置原型**——它创建的是一个**完全空白、没有 __proto__ 和 constructor 的对象**,其内部 [[Prototype]] 指针直接为 null。
为什么说它没有原型链起点
普通对象(如 {} 或 Object.create(Object.prototype))的原型链最终指向 Object.prototype,因此能访问 toString、hasOwnProperty 等方法。而 Object.create(null) 创建的对象:
- 内部 [[Prototype]] 值为
null(不是Object.prototype) - 没有
__proto__访问器属性(非标准但普遍支持,此处不可读/不可写) - 没有
constructor属性,也不继承任何方法 -
Object.getPrototypeOf(obj) === null返回true
和普通空对象的关键区别
对比一下:
const normal = {};
const nullProto = Object.create(null);
normal.toString(); // ✅ "object"
nullProto.toString(); // ❌ TypeError: nullProto.toString is not a function
Object.getPrototypeOf(normal); // → Object.prototype
Object.getPrototypeOf(nullProto); // → null
'constructor' in normal; // ✅ true
'constructor' in nullProto; // ❌ false
常见用途:避免原型污染与纯字典场景
因为不含内置方法和继承链,Object.create(null) 常用于:
- 实现安全的哈希表 / 映射(如解析配置、缓存键值对),防止用户输入的 key(如
"toString"、"__proto__")覆盖或触发原型方法 - 构建不依赖
Object.prototype的数据结构(如虚拟 DOM 的 props 对象、模块导出对象) - 需要严格判断自有属性的场景:
Object.keys(obj)和for...in在该对象上行为一致(都只遍历自身可枚举属性),且不会受原型干扰
如果想手动加回某些方法,可以显式挂载
它不是“被删掉”,而是初始为空;你可以按需添加:
const dict = Object.create(null);
dict.toString = () => '[object Dictionary]';
dict.hasOwnProperty = Object.prototype.hasOwnProperty;
dict.foo = 'bar';
dict.hasOwnProperty('foo'); // ✅ true
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











