Object.create(Object.prototype) 创建的是以 Object.prototype 为原型的空对象,非克隆,因不复制任何自有属性;它与 {} 功能等价,均继承 toString 等方法且无自有属性,但 {} 更简洁;仅在需显式控制属性描述符或强调纯净原型时使用。

用 Object.create(Object.prototype) 创建的并不是“克隆”,而是**新建一个以 Object.prototype 为原型的空对象**——它不复制任何自有属性,只继承标准对象方法(如 toString、hasOwnProperty 等)。
为什么这不是“克隆”?
“克隆”通常指复制已有对象的属性和结构,而 Object.create 是原型链层面的构造:它只设定新对象的 [[Prototype]],不读取或复制源对象的属性。传入 Object.prototype 只是让新对象拥有和普通字面量对象(如 {})一样的原型链,但本身仍是干净、无自有属性的对象。
它和 {} 有什么区别?
实际上,Object.create(Object.prototype) 和 {} 在行为上几乎等价:
- 两者都以
Object.prototype为原型 - 两者都没有自有属性(
Object.keys(obj)返回空数组) - 两者都能调用
obj.toString()、obj.hasOwnProperty('x')等方法
唯一的细微差别是:{} 还会设置 constructor 属性(指向 Object),而 Object.create(Object.prototype) 创建的对象也具备该属性(因为继承自 Object.prototype),所以功能完全一致。
立即学习“Java免费学习笔记(深入)”;
什么时候需要显式写这个?
多数情况不需要——直接用 {} 更简洁。但以下场景可能用到:
- 强调“严格基于
Object.prototype,不带额外原型污染”(比如在沙箱或防御性编程中) - 配合第二个参数定义属性描述符(例如创建不可枚举、只读的空对象)
- 作为
Object.create(null)的对比:后者创建的是“原型为null”的真·空白对象(无继承方法)
例如,想创建一个有特定属性但依然干净的对象:
const obj = Object.create(Object.prototype, {
name: { value: 'Alice', writable: true, enumerable: true },
age: { value: 30, writable: false }
});
如果真要“克隆”带原型的对象怎么办?
JavaScript 没有内置深克隆或原型+属性一键克隆的方法。常见做法是:
- 浅克隆 + 手动设置原型:
Object.assign(Object.create(Object.getPrototypeOf(src)), src) - 深克隆(如用
structuredClone,但不保留函数/原型) - 自定义克隆函数,显式复制属性并重设
__proto__或用Object.setPrototypeOf
注意:Object.create(Object.prototype) 本身不涉及源对象,因此不适用于克隆任务。


















