Object.create是JavaScript中基于指定原型创建新对象的原生方法,不调用构造函数,直接设置[[Prototype]];支持传入原型对象、属性描述符及null(创建无原型对象),比new更底层灵活。

Object.create 是 JavaScript 中用于**基于指定原型对象创建新对象**的原生方法,不调用构造函数,直接设置 [[Prototype]](即内部原型链)。它比 new 更底层、更灵活,适合实现纯原型继承或手动控制原型链。
基本用法:传入原型对象
最常见写法是只传一个参数 —— 作为新对象的原型:
const proto = { sayHello() { return 'Hello'; } };
const obj = Object.create(proto);
console.log(obj.sayHello()); // 'Hello'
console.log(Object.getPrototypeOf(obj) === proto); // true
此时 obj 的 __proto__(或 [[Prototype]])指向 proto,但自身没有自有属性。
第二个参数:定义自有属性(类似 Object.defineProperties)
可选的第二个参数是一个属性描述符对象,用来为新对象添加自有属性(非继承):
立即学习“Java免费学习笔记(深入)”;
- 语法与
Object.defineProperties()一致 - 每个键对应一个属性名,值是属性描述符(
value、writable、enumerable、configurable等)
示例:
const personProto = { greet() { return `Hi, I'm ${this.name}`; } };
const alice = Object.create(personProto, {
name: { value: 'Alice', writable: true, enumerable: true },
age: { value: 30, writable: false }
});
console.log(alice.greet()); // 'Hi, I'm Alice'
console.log(alice.name); // 'Alice'
console.log(alice.age); // 30
创建无原型对象(完全干净的空对象)
传入 null 作为第一个参数,可创建一个**没有继承任何内置方法**的对象(连 toString、hasOwnProperty 都没有):
const cleanObj = Object.create(null);
console.log(cleanObj.toString); // undefined
console.log('toString' in cleanObj); // false
这种对象常用于哈希表、配置映射等场景,避免原型污染和意外继承。
与 new 构造函数的区别
两者目的不同,不可混用:
-
Object.create(proto):只设置原型,不执行任何初始化逻辑,也不绑定this -
new Constructor():会调用构造函数、设置this.__proto__为Constructor.prototype,并返回该实例
如果你想模拟构造函数行为,需手动调用初始化方法:
const CarProto = {
init(brand, model) {
this.brand = brand;
this.model = model;
return this;
},
getInfo() { return `${this.brand} ${this.model}`; }
};
const myCar = Object.create(CarProto).init('Tesla', 'Model S');
不复杂但容易忽略:Object.create 的核心就是“把谁当爸爸”,其余都是围绕这个目标的精细控制。


















