Object.create的核心作用是用指定对象作为新对象的原型(__proto__)创建干净对象:传null得无原型对象;传普通对象则继承其属性方法;第二个参数可定义自有属性描述符;不调用构造函数,适用于精确控制原型链的场景。

Object.create 的核心作用就是:用你指定的任意对象作为新对象的原型(即 __proto__),创建一个“干净”的新对象。
基本用法:传入一个原型对象
最常见写法是只传一个参数——你要设为原型的对象:
- 如果传
null,新对象没有原型(__proto__为null),不继承任何东西; - 如果传普通对象(比如
{a: 1}),新对象的__proto__就指向它; - 如果传函数的
prototype(如Array.prototype),新对象就“假装”是那种类型的实例。
例如:
const proto = { say() { return 'hi'; } };const obj = Object.create(proto);
console.log(obj.say()); // 'hi'
console.log(Object.getPrototypeOf(obj) === proto); // true
第二个参数:定义自有属性(可选)
第二个参数是一个属性描述符对象,类似 Object.defineProperties 的第二个参数,用来给新对象直接添加自有属性(不是在原型上):
- 键是属性名,值是属性描述符(
value、writable、enumerable、configurable等); - 这些属性会直接挂载在新对象上,和原型无关;
- 常用于初始化带状态但又想复用原型方法的对象。
例如:
const personProto = {greet() { return `Hello, I'm ${this.name}`; }
};
const alice = Object.create(personProto, {
name: { value: 'Alice', writable: true },
age: { value: 30, enumerable: true }
});
console.log(alice.greet()); // 'Hello, I'm Alice'
console.log(alice.age); // 30
和 new 构造函数的区别
Object.create 不调用构造函数,也不设置 constructor 属性(除非原型里本来就有):
- 用
new Foo()会执行Foo函数,并把this.constructor指向Foo; - 用
Object.create(Foo.prototype)只设置原型链,不执行初始化逻辑,constructor默认指向Object(除非你手动改原型的constructor); - 所以它更适合“纯原型继承”或需要精细控制原型链的场景,比如实现类式继承的底层、创建无副作用的对象模板。
实用小技巧
- 快速创建空对象且不继承
Object.prototype:Object.create(null),适合做哈希表,避免toString等污染; - 模拟继承:
Child.prototype = Object.create(Parent.prototype),再补上constructor; - 测试时造“假对象”:用
Object.create(mockMethods)快速获得带特定方法但无真实逻辑的对象。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











