Object.create 是直接操控原型链最清晰的方式,它显式指定新对象的 [[Prototype]],支持创建无原型对象、同步定义自有属性,并可配合 getPrototypeOf/setPrototypeOf 动态调整原型链。

Object.create 是直接操控原型链最清晰的方式——它不依赖构造函数,也不走 new 流程,而是让你显式指定新对象的 [[Prototype]]。
用 Object.create 显式设置原型对象
传入一个对象作为参数,新对象的内部 [[Prototype]] 就指向它:
const animal = { eats: true };
const rabbit = Object.create(animal);
console.log(rabbit.eats); // true
console.log(Object.getPrototypeOf(rabbit) === animal); // true
这时 rabbit 自身没有 eats 属性,但能通过原型链访问到 animal 上的 eats。这正是原型链“属性查找机制”的体现:先查自身,再沿 __proto__ 向上找,直到 null。
创建无原型对象(彻底切断继承)
传入 null,得到一个原型链为 null 的纯净空对象:
const dict = Object.create(null);
dict.name = 'Alice';
console.log(dict.name); // 'Alice'
console.log(dict.toString); // undefined(没有 Object.prototype 方法)
console.log(Object.getPrototypeOf(dict)); // null
这种对象适合做纯字典(如缓存、映射表),避免 hasOwnProperty、toString 等原型方法被意外覆盖或干扰。
创建时同步定义自有属性
第二个参数是属性描述符对象,可一次性添加不可枚举、只读等特性的自有属性:
- 这些属性不会出现在原型上,而是直接挂在新对象自身
- 描述符格式与 Object.defineProperty 一致:value、writable、enumerable、configurable
- 例如:Object.create(animal, { jumps: { value: true, enumerable: true } })
这样既能复用原型行为(如 eats),又能精准控制自有状态(如 jumps),比字面量 + 手动赋值更可控。
配合 getPrototypeOf / setPrototypeOf 动态调整
原型链不是一成不变的,可以用配套方法实时干预:
- Object.getPrototypeOf(obj) 安全读取当前 [[Prototype]](比 obj.__proto__ 更规范)
- Object.setPrototypeOf(obj, newProto) 修改原型(慎用,性能开销大,且可能破坏优化)
- 例如:Object.setPrototypeOf(rabbit, {}); 会让 rabbit 失去对 animal 的继承
这类操作适合测试、代理封装或特殊继承场景,日常开发中优先用 Object.create 一次性设定,更清晰可靠。


















