object.create()是最标准优雅的原型继承方式,它不调用构造函数,仅建立干净原型链;原型只放共享方法和默认值,避免引用类型;新对象可自由添加自有属性或通过描述符精确控制属性特性;需注意浅继承导致的引用共享风险,应于实例初始化引用类型;支持多层原型链构建,实现轻量级分层复用。

直接用 Object.create() 就是最标准、最优雅的方式——它不调用任何构造函数,只专注建立干净的原型链,让对象复用行为和配置,同时保持自身属性独立。
明确原型对象,直接创建继承实例
把已有对象作为“模板原型”,用 Object.create() 创建新对象,新对象的 __proto__ 会精准指向该原型,访问属性时自动沿链查找,但自身不携带原型上的数据。
- 原型对象应只放共享方法和默认值,避免含引用类型(如数组、对象),否则会被所有实例共用
- 新对象可自由添加自有属性,不影响原型,也不影响其他继承者
- 示例:
const userProto = { isLoggedIn: false, login() { this.isLoggedIn = true; } }; const guest = Object.create(userProto); guest.name = "guest-001";
用第二个参数定义自有属性,兼顾继承与控制
传入属性描述符对象,能精确声明新对象自身的属性特性(是否可写、可枚举、可配置),避免污染原型,又保留继承能力。
- 描述符写法类似
Object.defineProperty,适合设置常量、私有语义或只读字段 - 同名属性会覆盖原型上的值,但仅限于当前实例,不影响原型或其他继承者
- 示例:
const admin = Object.create(userProto, { role: { value: "admin", writable: false }, id: { value: 1001 } });
注意浅继承带来的引用共享风险
Object.create() 不复制属性值,只链接原型。如果原型里有数组、对象等引用类型,所有继承者读取的是同一份内存地址。
- 这不是 bug,而是设计使然——它本就不是深拷贝工具
- 若需隔离状态,应在实例上初始化引用类型,比如
guest.preferences = {}或guest.cart = [] - 避免在原型中直接定义
data: []或config: {}这类可变结构
构建多层原型链,实现轻量级分层复用
可以链式调用 Object.create(),一层层向上委托,形成清晰的行为分层,比构造函数嵌套更直观、副作用更少。
- 例如:基础行为 → 业务逻辑 → 环境配置,每层只关注自己职责
- 调试时可通过
Object.getPrototypeOf(obj)逐级查看链路 - 不需要
new、不需要this绑定、不需要 constructor 检查,纯粹靠委托运行











