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

JavaScript原型继承问题:Object.create传入Student触发TypeError原因

报错原因解析

先明确两个核心规则

  • Object.create(obj) 的作用是创建一个空对象,并且将这个空对象的内部原型(__proto__)直接指向你传入的参数obj
  • 你代码里的Student.prototype.sayName = function() {} 是把方法挂载在Student的原型对象上,而非挂载在Student构造函数本身

原型链查找逻辑(原错误代码场景)

  1. 你原代码写的是EighthGrader.prototype = Object.create(Student),这里传入的参数是Student构造函数本身,因此最终EighthGrader.prototype.__proto__ 指向的是Student函数,不是存储了sayName方法的Student.prototype
  2. 调用carl.sayName()时,JS会按照原型链逐层向上查找:
    • 第一步查找carl实例自身的属性:没有sayName
    • 第二步查找carl.__proto__(也就是EighthGrader.prototype):没有sayName
    • 第三步查找EighthGrader.prototype.__proto__(也就是Student构造函数):你从未给Student函数本身挂载过sayName方法,查找失败
    • 继续向上查找Student.__proto__(即Function.prototype)、Object.prototype,全程匹配不到sayName,最终返回undefined
  3. 尝试把undefined作为函数调用,自然会抛出TypeError

修复逻辑说明

把参数改为Student.prototype后,EighthGrader.prototype.__proto__就会指向存储了sayName方法的Student.prototype对象,查找时可以正常匹配到方法,因此可以正常执行。

补充最佳实践:修正原型指向后建议额外添加一行 EighthGrader.prototype.constructor = EighthGrader,避免原型上的constructor属性指向错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:15:04