object.create()可实现原型式继承,新对象[[prototype]]指向源对象;支持自有属性定义、引用类型浅拷贝隔离、创建无原型对象。

直接用 Object.create() 就能实现原型式继承,不需要构造函数、不依赖 new,核心是让新对象的 [[Prototype]] 指向已有对象,从而复用它的属性和方法。
基本用法:指定原型对象
第一个参数传入你想“继承”的源对象,新对象会自动把该对象设为自己的原型:
const parent = { sayHi() { return 'Hello'; } };const child = Object.create(parent);console.log(child.sayHi()); // 'Hello'(从 parent 委托获取)console.log(child.__proto__ === parent); // true
定义自有属性:避免污染原型
第二个参数用于添加新对象自身的属性(不是挂在原型上),支持完整属性描述符:
const child = Object.create(parent, {name: { value: 'Alice', writable: true, enumerable: true },id: { value: 1001, writable: false }});- 这样
name和id是child自己的属性,不会影响parent,也不被其他继承者共享。
处理引用类型:防止意外修改
如果原型里有数组、对象等引用值,直接继承会导致多个实例共用同一份数据。需在自有属性中做浅拷贝隔离:
const base = { tags: ['js', 'web'], config: { mode: 'dev' } };const instance = Object.create(base, {tags: { value: [...base.tags], writable: true },config: { value: { ...base.config }, writable: true }});- 后续对
instance.tags.push('es6')不会影响base.tags。
特殊场景:创建无原型对象
传入 null 可创建一个干净的对象,不继承 Object.prototype 上的任何方法(如 toString、hasOwnProperty):
const obj = Object.create(null);obj.name = 'test';console.log(obj.toString); // undefined- 适合做纯字典、Map 替代或需要完全控制属性访问的场景。










