Object.create() 以原型对象为参数创建新对象,其[[Prototype]]直接指向该原型;参数必须是对象或null,否则抛TypeError;支持创建无继承的干净对象、定义自有属性特性,并需区分自有与继承属性。

原型对象配合 Object.create() 使用,核心是把它作为参数传入,让新对象的 [[Prototype]] 直接指向它——这是 JavaScript 原型继承最直接、最可控的方式。
原型对象必须是普通对象或 null
传给 Object.create() 的第一个参数(proto)必须是对象或 null。如果是原始值(如字符串、数字)、undefined 或未定义变量,会抛出 TypeError。
-
合法示例:
const proto = { say() { return 'Hi'; } };const obj = Object.create(proto); -
创建“干净”对象:
const map = Object.create(null);—— 不继承toString、hasOwnProperty等,适合做纯键值映射,避免属性名冲突
原型上的方法和属性自动可继承
新对象自身不拥有原型上的属性,但能通过原型链访问。只要原型对象有方法或数据属性,新对象就能调用或读取,前提是这些属性是可枚举/可访问的(默认普通属性都满足)。
const animal = { eats: true, move() { return 'moving...'; } };const dog = Object.create(animal);dog.eats; // true(来自原型)dog.move(); // 'moving...'(来自原型)dog.hasOwnProperty('eats'); // false(eats 不在 dog 自身)
可在创建时定义自有属性(第二个参数)
利用 propertiesObject 参数,能在新对象上一次性添加自有属性,并精确控制其特性(writable、enumerable、configurable),无需后续赋值或 defineProperty。
立即学习“Java免费学习笔记(深入)”;
-
const bird = Object.create(animal, {wings: { value: 2, writable: false, enumerable: true },name: { value: 'Robin', writable: true }}); bird.wings = 3; // 无效(writable: false)bird.name = 'Sparrow'; // 成功(writable: true)
区分“自有属性”和“继承属性”很关键
原型对象只提供共享行为,具体实例的状态应放在新对象自身。否则修改会影响所有共享该原型的对象(除非属性被重写)。
const base = { count: 0 };const a = Object.create(base);const b = Object.create(base);a.count++; // 错误示范:a 上没 own property,++ 操作会先读 base.count(0),再写 a.count = 1console.log(b.count); // 仍为 0 —— 安全;但若 base.count 是引用类型(如数组),就可能意外共享


















