Object.setPrototypeOf是替换对象原型还是构建原型链?
问题解析:Object.setPrototypeOf 是构建原型链而非直接替换对象
你理解错了Object.setPrototypeOf的作用——它不是替换目标对象,而是给目标对象设置它的上层原型(也就是内部的[[Prototype]]属性),相当于给目标对象搭了一条向上的原型链,目标对象自身的属性和方法完全保留。
具体看你的代码执行流程:
你先给
Rectangle.prototype这个对象添加了area方法:Rectangle.prototype.area = function(l, b) { return l * b; }这时候
Rectangle.prototype是一个拥有area方法的对象,它的默认原型是Object.prototype。然后调用
Object.setPrototypeOf(Rectangle.prototype, Shape.prototype):
这一步只是把Rectangle.prototype的上层原型改成了Shape.prototype,相当于让Rectangle.prototype继承了Shape.prototype的方法。但Rectangle.prototype本身还是那个带有area方法的对象,根本没被替换。最后修正
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
相关产品推荐
相关产品推荐

