object.create 更安全高效,直接创建以指定对象为原型的新对象,不修改原对象;object.setprototypeof 则动态改写目标对象原型,易引发性能问题与不可变性破坏。

Object.create 可以直接创建一个以指定对象为原型的新对象,从而避免修改已有对象的原型链,比 Object.setPrototypeOf 更安全、更符合不可变设计原则。
用 Object.create 建立干净的原型关系
Object.setPrototypeOf 会直接修改目标对象的 [[Prototype]],可能影响已有属性访问、破坏不可变性,甚至引发性能问题(如 V8 中原型链变更会失效内联缓存)。而 Object.create 从一开始就构造好原型链,不改动任何现有对象。
- 语法简单:
Object.create(proto, propertiesObject),第一个参数是希望继承的原型对象 - 返回一个全新对象,其
__proto__指向proto,且自身不含额外属性 - 适合用于“组合式继承”或“寄生式继承”,比如封装某个类的实例但不想污染原实例
替代 Object.setPrototypeOf 的典型场景
常见于需要临时借用某对象方法、模拟类继承、或构建轻量级委托结构时:
- 想让空对象拥有 Array.prototype 方法?
const arrLike = Object.create(Array.prototype),之后可调用push、map等(注意 length 需手动维护) - 实现子类行为但不使用 class?
function Child() {} Child.prototype = Object.create(Parent.prototype); Child.prototype.constructor = Child - 测试中模拟具有特定原型的对象,避免修改真实对象的原型
注意 propertiesObject 参数的用途
第二个参数可用于在新对象上直接定义自有属性(含 getter/setter、是否可枚举等),相当于一步完成原型设置 + 属性初始化:
- 例如:
Object.create(proto, { x: { value: 42, writable: true } }) - 若只需设原型,传
null或省略该参数即可,无需额外 defineProperty - 这比先 create 再 defineProperty 更简洁,也比 setPrototypeOf + defineProperty 组合更声明式
为什么不推荐混用两者
Object.setPrototypeOf 是运行时动态改写,容易导致意外行为;Object.create 是构造时静态设定,语义清晰、调试友好:
- 多次 setPrototypeOf 可能触发引擎降级(如从快路径转为慢路径)
- 某些环境(如严格模式下的某些引擎)对 setPrototypeOf 有额外限制
- 代码可读性差:看到 setPrototypeOf 往往得回溯确认“这个对象原本是谁的实例?”











