You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Object.create()在原型继承代码中的作用及必要性技术问询

嘿,这个问题问得特别戳中原型继承的核心细节——很多刚上手JS原型链的开发者都会疑惑:为啥注释掉那两行代码,rect.y还能正常输出0?这就得拆解清楚Object.create()在这里的真正价值了:

先搞懂:为啥注释掉后代码还能跑?

你注释掉两行后,rect.y能拿到0,靠的是Shape.call(this)这行代码:它在Rectangle构造函数里,把Shape构造函数内的this.xthis.y直接挂载到了Rectangle的实例上。这本质是构造函数的属性复制,和原型链没啥关系,只是让实例拥有了父类构造函数里定义的实例属性。

Object.create(Shape.prototype)的核心意义

这行代码的真正作用是搭建原型链继承关系,核心价值体现在这几点:

  1. 复用父类原型上的方法
    假设我们给Shape的原型加一个共享方法:

    Shape.prototype.move = function(dx, dy) {
      this.x += dx;
      this.y += dy;
    }
    

    如果没有Object.create()这行,Rectangle的原型还是默认的Object.prototyperect.move(10,20)会直接报错——因为实例找不到这个方法。但加上这行后,Rectangle的原型对象指向了一个以Shape.prototype为原型的新对象,rect就能通过原型链向上找到Shape.prototype上的move方法,实现了方法的复用(不用每个子类实例都重新创建一遍方法,节省内存)。

  2. 建立正确的原型链关系
    没有这行的话,rect instanceof Shape会返回false,因为rect的原型链根本没和Shape挂钩。加上后,原型链变成了rect → Rectangle.prototype → Shape.prototype → Object.prototypeinstanceof判断、Object.getPrototypeOf()等原型相关的API才能正常工作,符合JS的继承规范。

为啥还要加Rectangle.prototype.constructor = Rectangle

因为Object.create(Shape.prototype)创建的新对象,它的constructor属性会继承自Shape.prototype,也就是指向Shape构造函数。这会导致rect.constructor返回Shape,不符合我们的预期——毕竟rectRectangle的实例。所以这行是把构造函数的指向修正回Rectangle,保证原型链的完整性。

总结一下

你注释掉两行后能跑,只是因为你只用到了父类的实例属性;但Object.create()是为了实现原型方法的继承正确的原型链关系,这才是JS原型继承的核心价值——毕竟继承的意义更多是复用父类的共享方法,而不是单纯复制属性。

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

火山引擎 最新活动