Object.create是JavaScript中显式指定原型创建新对象的方法,不调用构造函数;可传入原型对象、属性描述符对象或null(创建无原型对象),与new构造函数的关键区别在于不执行构造逻辑且不自动绑定constructor。

Object.create 是 JavaScript 中用于**显式指定原型对象来创建新对象**的核心方法。它不调用构造函数,也不依赖 new,而是直接将传入的对象设为新对象的 [[Prototype]](即 __proto__)。
基本用法:传入一个原型对象
最常见形式是只传一个参数 —— 作为新对象原型的对象:
const proto = { sayHello() { return 'Hello'; } };
const obj = Object.create(proto);
console.log(obj.sayHello()); // 'Hello'
console.log(Object.getPrototypeOf(obj) === proto); // true
此时 obj 的原型就是 proto,所有属性和方法都可沿原型链访问。
第二个参数:定义自有属性(类似 Object.defineProperties)
可选的第二个参数是一个属性描述符对象,用来给新对象添加**自身拥有的属性**(不是继承来的),语法与 Object.defineProperties 一致:
立即学习“Java免费学习笔记(深入)”;
- 键名是属性名
- 值是该属性的描述符(
value、writable、enumerable、configurable等)
例如:
const proto = { type: 'animal' };
const dog = Object.create(proto, {
name: { value: 'Buddy', writable: true, enumerable: true },
age: { value: 3, writable: false }
});
console.log(dog.name); // 'Buddy'
console.log(dog.type); // 'animal'(从原型继承)
console.log('name' in dog); // true(自有)
console.log('type' in dog); // true(继承)
创建无原型对象(完全隔离的空对象)
传入 null 可创建一个**没有原型**的对象(即 [[Prototype]] 为 null),常用于避免原型污染或构建纯净字典:
const cleanObj = Object.create(null); console.log(cleanObj.toString); // undefined(不继承 Object.prototype 方法) console.log(Object.getPrototypeOf(cleanObj)); // null
注意:这种对象不能直接使用 hasOwnProperty、toString 等通用方法,需显式借用:Object.prototype.hasOwnProperty.call(cleanObj, 'key')。
与 new 构造函数的区别
Object.create 不执行构造逻辑,不绑定 this,也不触发 constructor 属性自动设置:
- 用
new Foo()创建的对象,其constructor指向Foo - 用
Object.create(Foo.prototype)创建的对象,constructor默认指向Foo(因为Foo.prototype.constructor === Foo),但若原型被修改过,可能丢失该引用 - 如需确保
constructor正确,可手动修复:obj.constructor = MyConstructor


















