object.create 的核心是创建新对象并将其原型指向指定对象且不执行构造函数;手动实现需用空函数过渡、处理 null 原型边界、支持属性描述符参数,避免污染原型链。

Object.create 的核心是创建一个新对象,并将其原型(__proto__)指向指定对象,同时不执行构造函数。手动实现的关键在于:用空函数过渡、正确设置原型、避免污染 Object.prototype。
用空函数作为中介,隔离原型链
不能直接 new 一个对象再改 __proto__(部分环境不支持或不可靠),也不能直接 Object.prototype.__proto__ = xxx(会污染全局)。稳妥做法是定义一个空构造函数,把目标对象赋给它的 prototype,再用 new 调用它:
function create(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();
}
处理 null 原型的边界情况
Object.create(null) 返回一个无原型的对象(即 __proto__ 为 undefined,不继承任何方法)。原生实现中,当传入 null 时,新对象的内部 [[Prototype]] 为 null。手动实现需单独判断:
PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
- 若 proto === null,返回一个没有原型的对象,可用 Object.setPrototypeOf({}, null) 或更兼容的方式:先创建空对象,再设其原型为 null
- 注意:不能写成
obj.__proto__ = null,因该属性非标准且某些环境不可写 - 推荐用
Object.setPrototypeOf(obj, null),或在不支持时用 Object.defineProperty 模拟
支持第二个参数(属性描述符)
原生 Object.create 接收可选的第二个参数,用于定义新对象自身的属性(类似 Object.defineProperties)。polyfill 需额外处理:
- 检查第二个参数是否为对象(null 除外)
- 对每个键调用 Object.defineProperty(newObj, key, descriptor)
- 注意:descriptor 必须是有效描述符对象(不能是 null/undefined,且不能同时含 get/set 和 value/writable)
完整 polyfill 示例
综合以上要点,一个较完整的实现如下:
function create(proto, propertiesObject) {
if (proto !== null && typeof proto !== 'object') {
throw new TypeError('Object prototype may only be an Object or null');
}
function F() {}
F.prototype = proto;
const obj = new F();
if (propertiesObject !== undefined) {
if (propertiesObject === null || typeof propertiesObject !== 'object') {
throw new TypeError('Property description must be an object');
}
Object.defineProperties(obj, propertiesObject);
}
return obj;
}
这个实现覆盖了基本行为、null 原型、属性定义三类场景,在现代浏览器和多数旧环境中均可稳定运行。










