object.create 是 javascript 中用于精确控制对象原型链的核心方法,它不调用构造函数,直接指定新对象的 [[prototype]];语法为 object.create(proto, propertiesobject),其中 proto 必须是对象或 null,propertiesobject 用于定义自有属性的描述符。

Object.create 是 JavaScript 中用于精确控制对象原型链的核心方法,它不调用构造函数,也不依赖 new,而是直接指定新对象的 [[Prototype]]。
基本语法与必需参数
调用格式为 Object.create(proto, propertiesObject),其中第一个参数 proto 是必须的,且只能是对象或 null。传 null 会创建一个“无原型”的纯净对象(连 toString、hasOwnProperty 都没有);传普通对象则让新对象继承其属性和方法。
- 若 proto 不是对象也不是 null,会抛出 TypeError
- 不能传 undefined、字符串、数字等原始值(包括包装对象如 new String())
- 常见写法:
const obj = Object.create({a: 1})或const safeMap = Object.create(null)
用 propertiesObject 定义自有属性
第二个参数是可选的属性描述符对象,结构类似 Object.defineProperties 的第二个参数,用来定义新对象自身的属性(不是继承来的),每个属性需明确配置特性。
- 支持数据属性:value、writable、enumerable、configurable
- 也支持访问器属性:get、set(需成对或单独定义)
- 所有特性默认为 false,例如
enumerable: false表示该属性不会出现在 for...in 或 Object.keys() 中 - 示例:
Object.create(parent, { x: { value: 10, writable: false } })
典型使用场景
它最适合需要显式、干净地建立原型关系的场合,比构造函数更轻量,比对象字面量更可控。
- 实现原型继承:比如让 dog 继承 animal 的 eat 方法,再添加自己的 bark
-
创建安全字典对象:用
Object.create(null)避免原型污染,适合做 key-value 映射 - 构建不可变基础对象:配合 writable: false 和 configurable: false 控制属性行为
- 替代 new 构造函数:当不需要初始化逻辑,只关心继承结构时更简洁
注意与常见误区
它和字面量 {}、new Object() 的关键区别在于原型指向不同——后两者默认以 Object.prototype 为原型,而 Object.create 允许你完全自定义。
- 返回的新对象没有 constructor 属性(除非原型里显式定义了)
- propertiesObject 中定义的属性属于新对象自身,不是原型上的
- 不要混淆
__proto__(非标准但广泛支持)和[[Prototype]](内部属性,可通过 Object.getPrototypeOf 读取) - 不推荐在循环中频繁调用,因每次都会新建对象实例
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











