JavaScript原型继承问题:Object.create传入Student触发TypeError原因
报错原因解析
先明确两个核心规则
Object.create(obj)的作用是创建一个空对象,并且将这个空对象的内部原型(__proto__)直接指向你传入的参数obj- 你代码里的
Student.prototype.sayName = function() {}是把方法挂载在Student的原型对象上,而非挂载在Student构造函数本身
原型链查找逻辑(原错误代码场景)
- 你原代码写的是
EighthGrader.prototype = Object.create(Student),这里传入的参数是Student构造函数本身,因此最终EighthGrader.prototype.__proto__指向的是Student函数,不是存储了sayName方法的Student.prototype - 调用
carl.sayName()时,JS会按照原型链逐层向上查找:- 第一步查找carl实例自身的属性:没有
sayName - 第二步查找
carl.__proto__(也就是EighthGrader.prototype):没有sayName - 第三步查找
EighthGrader.prototype.__proto__(也就是Student构造函数):你从未给Student函数本身挂载过sayName方法,查找失败 - 继续向上查找
Student.__proto__(即Function.prototype)、Object.prototype,全程匹配不到sayName,最终返回undefined
- 第一步查找carl实例自身的属性:没有
- 尝试把
undefined作为函数调用,自然会抛出TypeError
修复逻辑说明
把参数改为Student.prototype后,EighthGrader.prototype.__proto__就会指向存储了sayName方法的Student.prototype对象,查找时可以正常匹配到方法,因此可以正常执行。
补充最佳实践:修正原型指向后建议额外添加一行
EighthGrader.prototype.constructor = EighthGrader,避免原型上的constructor属性指向错误。
内容的提问来源于stack exchange,提问作者Alan Hemming
相关产品推荐
相关产品推荐

