object.create 是 javascript 中不调用构造函数、直接以指定对象为原型创建新对象的方法;支持传入原型对象(含 null)和属性描述符,并与 new 操作符在初始化和 constructor 设置上存在本质区别。

Object.create 是 JavaScript 中创建新对象的底层方式之一,它不调用构造函数,而是直接以指定对象为原型(prototype)生成新对象。
基本用法:指定原型对象
最常见用法是传入一个对象作为新对象的 [[Prototype]]:
- 第一个参数是将作为新对象原型的对象(不能是
null或原始值,除非显式传null) - 第二个参数(可选)用于定义新对象自身的属性描述符(类似
Object.defineProperties的第二个参数)
例如:
const proto = { say() { return 'Hello'; } };const obj = Object.create(proto);
console.log(obj.say()); // 'Hello'
console.log(Object.getPrototypeOf(obj) === proto); // true
创建无原型的对象
如果想让新对象没有内置原型(即不继承 Object.prototype 上的方法),可以传 null:
console.log(noProtoObj.toString); // undefined
console.log('toString' in noProtoObj); // false
这种对象常用于实现哈希表、配置字面量等避免原型干扰的场景。
同时定义自有属性(使用属性描述符)
第二个参数接受一个属性描述符对象,用来添加不可枚举、只读或有 getter/setter 的自有属性:
const parent = { x: 1 };const child = Object.create(parent, {
y: { value: 2, writable: true, enumerable: true, configurable: true },
z: { get() { return this.y * 2; }, enumerable: true }
});
console.log(child.y); // 2
console.log(child.z); // 4
console.log(child.x); // 1(从 parent 继承)
和构造函数 new 的区别
Object.create 不执行任何初始化逻辑,也不设置 constructor 属性(除非原型上显式定义);而 new Fn() 会调用构造函数,并默认把 Fn.prototype 设为新对象原型。
如果你想模拟构造行为,可以手动设置:
const PersonProto = {greet() { return `Hi, I'm ${this.name}`; }
};
const alice = Object.create(PersonProto);
alice.name = 'Alice';
alice.constructor = PersonProto.constructor; // 可选,仅当需要 constructor 引用时
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











