为何需将DerivedObject.prototype.constructor重置为自身?不做会有何问题?
为什么必须重置原型的
constructor属性? 我来给你捋清楚这个问题——你做的示例看起来没问题,是因为你还没碰到依赖constructor属性的场景,一旦遇到,问题就会显现出来。
首先,先搞明白为什么constructor会跑偏:当你用Teacher.prototype = Object.create(Person.prototype)实现原型继承时,Teacher.prototype本质上是一个以Person.prototype为原型的新对象,所以它的constructor属性会继承自Person.prototype,也就是指向Person构造函数,而不是Teacher。
不重置这个属性会带来这些潜在问题:
- 语义与逻辑不符:当你创建一个
new Teacher()的实例时,它的constructor会指向Person,但从语义上讲,这个实例是Teacher的产物,constructor应该指向它的“亲生”构造函数Teacher,这会造成认知和逻辑上的混乱。 - 类型判断出错:如果你的代码里有通过
instance.constructor === Teacher来判断实例类型的逻辑,结果会是false,而instance.constructor === Person会返回true,这显然不符合预期。虽然instanceof运算符依然能正常工作(因为它检查的是原型链),但直接判断constructor的场景就会失效。 - 子类继承的连锁问题:如果之后你再创建一个继承自
Teacher的子类(比如Student),不重置Teacher的constructor的话,Student.prototype.constructor也会错误地指向Person,导致整个继承链的构造函数指向都乱掉。 - 依赖
constructor的工具/库出错:有些第三方库或者自己写的工具函数,会通过constructor属性来创建新实例(比如const newInstance = new obj.constructor()),或者基于它做类型校验,这时候错误的constructor指向会直接导致这些功能异常。
你在示例里没发现问题,只是因为你的代码没有触发这些场景而已,但在更复杂的代码中,这个小疏忽很可能埋下难以排查的bug。
内容的提问来源于stack exchange,提问作者bdsg4D
相关产品推荐
相关产品推荐

