You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Object.setPrototypeOf是替换对象原型还是构建原型链?

问题解析:Object.setPrototypeOf 是构建原型链而非直接替换对象

你理解错了Object.setPrototypeOf的作用——它不是替换目标对象,而是给目标对象设置它的上层原型(也就是内部的[[Prototype]]属性),相当于给目标对象搭了一条向上的原型链,目标对象自身的属性和方法完全保留。

具体看你的代码执行流程:

  1. 你先给Rectangle.prototype这个对象添加了area方法:

    Rectangle.prototype.area = function(l, b) {
        return l * b;
    }
    

    这时候Rectangle.prototype是一个拥有area方法的对象,它的默认原型是Object.prototype。

  2. 然后调用Object.setPrototypeOf(Rectangle.prototype, Shape.prototype):
    这一步只是把Rectangle.prototype的上层原型改成了Shape.prototype,相当于让Rectangle.prototype继承了Shape.prototype的方法。但Rectangle.prototype本身还是那个带有area方法的对象,根本没被替换。

  3. 最后修正constructor指向,这一步不影响方法的访问。

为什么还能访问area?

当你通过new Rectangle()创建实例r后,访问r.area时,JS的原型链查找逻辑是:

  • 先找r自身的属性 → 没有
  • 再找r的原型(也就是Rectangle.prototype)→ 这里有area方法,直接返回使用
  • 如果是访问r.move,就会继续往上找Rectangle.prototype的原型(也就是Shape.prototype),找到move方法

要是真的「替换」原型会怎么样?

如果你写成下面这种直接赋值的方式,才会丢失area方法:

// 这才是替换,直接让Rectangle.prototype指向Shape.prototype
Rectangle.prototype = Shape.prototype;
// 这时候之前加的area方法所在的对象已经被丢弃了,自然访问不到

总结一下:Object.setPrototypeOf是构建原型继承关系,让目标对象能继承上层原型的方法,同时保留自身的属性和方法,而不是替换掉目标对象本身。

内容的提问来源于stack exchange,提问作者Bishnu Chalise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:33:16