object.create 的核心是创建新对象并将其 [[prototype]] 指向指定对象,不调用构造函数、不污染原对象;基础实现用空函数桥接原型,支持 null 和对象,进阶版可结合 object.defineproperties 处理属性描述符。

手写实现 Object.create 的核心,是**创建一个新对象,并将其原型([[Prototype]])指向指定的对象**,同时不调用构造函数、不污染原对象。它不处理第二个参数(属性描述符),那是增强功能,基础版只关注原型链设置。
关键点:用空函数桥接原型
由于不能直接设置新对象的 [[Prototype]](ES5 无 Object.setPrototypeOf 或 __proto__ 标准支持),最兼容的方式是:
- 定义一个临时空构造函数
- 把传入的
proto赋给该函数的prototype - 用
new调用它,返回的新实例自然继承proto - 最后修正构造器指向(可选,更严谨)
基础实现(兼容 ES3+)
// 模拟 Object.create(proto)
function myCreate(proto) {
if (proto !== null && typeof proto !== 'object') {
throw new TypeError('Object prototype may only be an Object or null');
}
function F() {}
F.prototype = proto;
return new F();
}
✅ 支持 myCreate(null)(返回无原型的对象)
✅ 支持 myCreate({a: 1})(新对象可访问 a)
✅ 不修改 proto 本身
补充:处理 proto === null 的细节
原生 Object.create(null) 返回的对象没有 constructor、toString 等默认原型方法。上面实现中,当 proto === null 时,F.prototype = null,new F() 的 [[Prototype]] 就是 null —— 这正是我们想要的,无需额外分支。
进阶:支持第二个参数(属性描述符)
若想模拟完整版 Object.create(proto, propertiesObject),只需在返回对象后,用 Object.defineProperties 添加自有属性:
function myCreate(proto, propertiesObject) {
const obj = myCreate(proto); // 复用上面逻辑
if (propertiesObject != null) {
Object.defineProperties(obj, propertiesObject);
}
return obj;
}
⚠️ 注意:propertiesObject 格式需与 Object.defineProperties 一致(键为属性名,值为描述符对象)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











