object.create()是javascript中直接基于指定原型创建新对象的标准方法,可传入原型对象和属性描述符,支持创建无原型对象,且不调用构造函数。

Object.create() 是 JavaScript 中直接基于指定原型对象创建新对象的标准方法,它绕过了构造函数,让原型链的建立更清晰、更底层。
基本用法:传入原型对象
最简单的形式是只传一个参数——你希望新对象继承的原型对象:
- const proto = { sayHello() { return 'Hello'; } };
- const obj = Object.create(proto);
- obj.sayHello(); // 'Hello'
- Object.getPrototypeOf(obj) === proto; // true
此时 obj 的内部 [[Prototype]] 指向 proto,没有其他中间环节(比如不经过 proto.constructor.prototype)。
第二个参数:定义自有属性(可选)
你可以通过第二个参数(属性描述符对象)为新对象添加自身拥有的属性,类似 Object.defineProperties():
- const obj = Object.create(proto, {
- name: { value: 'Alice', writable: true },
- age: { value: 30, enumerable: true }
- });
注意:这些属性不会出现在原型上,而是直接挂在 obj 自身;描述符写法和 Object.defineProperty 一致,支持 value、writable、enumerable、configurable 等键。
创建无原型的对象(空原型)
传入 null 可创建一个“纯净”的对象,它不继承自 Object.prototype,因此没有 toString、hasOwnProperty 等默认方法:
- const bareObj = Object.create(null);
- bareObj.toString; // undefined
- bareObj.hasOwnProperty; // undefined
这种对象常用于实现哈希表或避免原型污染(例如 Object.create(null) 是创建安全字典的推荐方式)。
与 new 构造函数的区别
Object.create(proto) 不调用任何构造函数,也不设置 constructor 属性;而 new Fn() 会执行函数体,并默认让实例的 constructor 指向 Fn。若需保留 constructor 引用,可手动设置:
- const obj = Object.create(proto);
- obj.constructor = proto.constructor || Object;
但通常这不是必须的,现代代码更关注行为继承而非 constructor 值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











