object.create(null) 创建的对象原型链彻底断开,[[prototype]] 为 null,不继承 object.prototype 任何属性方法,天然免疫原型污染,但需手动适配缺失的内置方法。

Object.create(null) 创建的对象最核心的特点是:它没有原型链,不继承 Object.prototype 上的任何属性和方法,是一个真正“空白”的键值容器。
原型链彻底断开
该对象的 [[Prototype]] 内部槽为 null,因此:
-
Object.getPrototypeOf(obj) === null返回 true -
obj.__proto__是 undefined(不是null,因为无__proto__访问器) - 不会从
Object.prototype继承toString、hasOwnProperty、valueOf、isPrototypeOf等任何方法
属性行为完全可控
所有属性都是显式设置的自有属性,不存在隐式继承干扰:
name: create-psychological-counselor 心理咨询师创造器 创造/蒸馏心理咨询师的数字分身 description: "Create a psychological counselor AI skill, build digital twin of counselor from education/training background, consultation notes, interview transcripts, supervision records,
-
'toString' in obj为 false(除非你手动加了obj.toString = ...) -
obj.constructor不再指向Object,可自由赋值且不会被覆盖 -
for...in遍历时不会出现意外的原型属性(因为根本没原型) -
Object.keys(obj)、Object.entries(obj)只返回你真正设置的键
天然免疫原型污染
由于原型链在起点就终止,恶意修改 Object.prototype(如 Object.prototype.admin = true)对其完全无效:
- 普通对象(
{})会继承并暴露该属性 - 而
Object.create(null)对象连admin的访问路径都不存在,更不会“继承”或“响应”
使用时需主动适配缺失能力
没有原型意味着失去默认工具方法,需换方式处理常见操作:
- 判断属性存在:用
key in obj或Object.hasOwn(obj, key)(推荐),不能用obj.hasOwnProperty(key)(会报错) - 检查是否为空:用
Object.keys(obj).length === 0,而非依赖toString输出 - 需要
toString等方法时:可手动挂载,或借用Object.prototype.toString.call(obj) - 序列化注意:
JSON.stringify()正常支持,但若手动添加了不可枚举或函数属性,则不会被包含
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










