JavaScript 类继承中 super 调用方法未找到的排查与解决

JavaScript 类继承中 super 调用方法未找到的排查与解决

本文探讨在 JavaScript 类继承中,子类通过 super 调用父类方法时遇到 TypeError 的常见原因及解决方案。当父类方法被定义为构造函数内部的实例属性而非原型方法时,super 机制无法正确查找。文章将详细阐述这一机制差异,并提供将方法定义为类体内部的原型方法,以及利用 ES2022 私有字段管理内部状态的正确实践,确保继承链中方法调用的顺畅与代码的健壮性。

JavaScript 类继承与 super 关键字

在 javascript 中,类继承允许我们构建基于现有类的子类,从而实现代码复用和层次结构。super 关键字在子类中扮演着核心角色,它允许我们调用父类的构造函数(super())或访问父类的方法和属性(super.method())。然而,在使用 super 调用父类方法时,一个常见的陷阱可能导致 typeerror,即父类方法未被正确识别。

问题根源:构造函数内部定义的方法与原型方法

当我们在父类构造函数内部使用 this.methodName = () => {} 的形式定义方法时,实际上是为每个实例创建了一个独立的 methodName 属性,这个属性的值是一个函数。这种方法被称为“实例方法属性”或“绑定方法”,因为它直接绑定到实例上。

class Parent {  constructor() {    // 实例方法属性:每个实例都有自己的 updateUI 函数    this.updateUI = (arg1, arg2) => {      console.log('Parent updateUI called');    };  }}class Child extends Parent {  constructor() {    super();  }  doSomething() {    // 尝试调用 super.updateUI()    // 问题在于 super 查找的是原型链上的方法,而不是实例属性    super.updateUI(); // 会抛出 TypeError  }}const childInstance = new Child();childInstance.doSomething(); // Uncaught TypeError: (intermediate value).updateUI is not a function

super.method() 的机制是,它会在当前实例的原型链上查找 method。如果 method 是在类体内部直接定义的方法(即原型方法),它就会被正确找到。但如果 method 是在构造函数内部作为实例属性定义的,那么它就不在原型链上,super 自然无法找到,从而导致 TypeError。

解决方案:将方法定义为原型方法

解决此问题的最直接和推荐的方法是将方法定义在类体内部,而不是构造函数内部。这样定义的方法会自动添加到类的原型上,成为原型方法,所有实例共享同一个方法定义,并且 super 机制可以正确地在原型链上找到它们。

// 父类:RosterTableUtilclass RosterTableUtil {  // 定义内部状态,可以使用私有字段(ES2022)增强封装性  #highLightCellIndex = -1;  #highLightRowIndex = -1;  // 将 updateUI 定义为原型方法  updateUI(cellIndex, rowIndex) {    this.#highLightCellIndex = cellIndex;    this.#highLightRowIndex = rowIndex;    console.log(`RosterTableUtil: Highlighting row ${this.#highLightRowIndex}, cell ${this.#highLightCellIndex}`);  }}// 子类:RosterSchedulerTableUtilclass RosterSchedulerTableUtil extends RosterTableUtil {  constructor() {    super(); // 调用父类构造函数    // 其他初始化逻辑...  }  // 重写 updateUI 方法  updateUI(cellIndex, rowIndex) {    // 正确调用父类的 updateUI 方法    super.updateUI(cellIndex, rowIndex);    // 子类特有的逻辑    this.#updateSelectRegion(cellIndex, rowIndex); // 假设有私有辅助方法    console.log(`RosterSchedulerTableUtil: Also updating select region.`);  }  // 子类内部辅助方法(示例)  #updateSelectRegion(cellIndex, rowIndex) {    // 实现选择区域更新逻辑  }}// 示例使用const schedulerUtil = new RosterSchedulerTableUtil();schedulerUtil.updateUI(1, 2); // 正常调用,不再报错schedulerUtil.updateUI(3, 4);

在上述代码中:

立即学习“Java免费学习笔记(深入)”;

RosterTableUtil 类中的 updateUI 方法直接定义在类体内部,使其成为原型方法。内部状态 highLightCellIndex 和 highLightRowIndex 使用了 ES2022 引入的私有字段(# 前缀)进行封装。私有字段只能在类的内部访问,提供了更强的封装性,是替代构造函数内部闭包变量的现代方式。RosterSchedulerTableUtil 子类中的 updateUI 方法通过 super.updateUI(cellIndex, rowIndex) 成功调用了父类的原型方法。

注意事项与最佳实践

原型方法 vs. 实例方法属性:

原型方法(推荐): 定义在类体内部。它们存在于类的原型上,所有实例共享同一个方法引用,节省内存。super 关键字可以正确访问它们。实例方法属性: 定义在构造函数内部,或使用类字段语法直接在类体中作为箭头函数定义。每个实例都有一个独立的方法副本。如果方法需要绑定 this 到实例(例如作为事件处理器),并且不涉及 super 调用,这可能是一个选择,但通常可以通过在构造函数中绑定或在调用时使用箭头函数来避免。

封装内部状态:

如果需要管理类的内部状态,并且不希望外部直接访问,ES2022 的私有字段 (#fieldName) 是最佳选择。它们提供了真正的私有性。避免在构造函数内部使用闭包来“私有化”变量,因为这可能导致代码结构复杂,并且如本例所示,与继承机制不兼容。

代码可读性与维护性: 将方法定义为原型方法,使类结构更清晰,更符合面向对象编程的习惯。这也有助于优化内存使用,因为所有实例共享相同的方法定义,而不是为每个实例创建单独的函数副本。

总结

在 JavaScript 类继承中,理解 super 关键字查找方法的机制至关重要。当子类通过 super 调用父类方法时,该方法必须是定义在父类原型上的“原型方法”,而不是在构造函数内部作为实例属性创建的函数。通过将方法直接定义在类体内部,并结合使用现代 JavaScript 特性如私有字段来管理内部状态,我们可以构建出更健壮、更易于维护的面向对象代码。

以上就是JavaScript 类继承中 super 调用方法未找到的排查与解决的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1508766.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
BOM的print方法有什么用?如何用它打印页面?
上一篇 2025年12月20日 05:04:55
JavaScript的setTimeout函数是什么?怎么用?
下一篇 2025年12月20日 05:05:07

相关推荐

  • 骁龙X2 Elite正式发布:共3个版本 最高配达18核

    骁龙X2 Elite正式发布:共3个版本 最高配达18核骁龙X2 Elite正式发布:共3个版本 最高配达18核骁龙X2 Elite正式发布:共3个版本 最高配达18核骁龙X2 Elite正式发布:共3个版本 最高配达18核

    在今日的骁龙峰会上,高通不仅推出了第五代骁龙8至尊版移动平台,还正式发布了全新的pc处理器——骁龙x2 elite。该芯片延续了基于arm架构的第三代oryon cpu设计,旨在进一步拓展其在windows笔记本市场中的竞争力。 此次发布的骁龙X2 Elite共包含三个型号:X2E-80-100、X…

    2026年9月28日 • 用户投稿
    000
  • 荣耀MagicBook Art 14 2025发布:1kg、1cm,8499元起

    荣耀MagicBook Art 14 2025发布:1kg、1cm,8499元起荣耀MagicBook Art 14 2025发布:1kg、1cm,8499元起荣耀MagicBook Art 14 2025发布:1kg、1cm,8499元起荣耀MagicBook Art 14 2025发布:1kg、1cm,8499元起

    7月2日,荣耀推出全新旗舰轻薄本magicbook art 14 2025。该产品整机重量1kg,闭合状态厚度1cm,起售价8499元(国补后6799.2元起),即日开售。 该产品配备1600nit OLED绿洲护眼屏:14.6英寸触控屏支持4320Hz高频PWM调光、100% DCI-P3色域及Δ…

    2026年9月28日 • 用户投稿
    1200
  • 第五代高通骁龙8至尊版正式发布:全球最快移动SoC

    第五代高通骁龙8至尊版正式发布:全球最快移动SoC第五代高通骁龙8至尊版正式发布:全球最快移动SoC第五代高通骁龙8至尊版正式发布:全球最快移动SoC第五代高通骁龙8至尊版正式发布:全球最快移动SoC

    在今日举行的骁龙峰会上,高通正式发布了其最新旗舰移动平台——第五代骁龙 8 至尊版(Snapdragon 8 Elite Gen 5),并宣称该芯片为“全球速度最快的移动 SoC”。 此次发布的芯片基于台积电最新的第三代3nm N3P工艺打造,在CPU架构上采用了全新的Oryon核心设计,延续了2+…

    2026年9月28日 • 用户投稿
    000
  • Java中ArrayList引用传递陷阱:避免数据意外修改的策略

    Java中ArrayList引用传递陷阱:避免数据意外修改的策略Java中ArrayList引用传递陷阱:避免数据意外修改的策略Java中ArrayList引用传递陷阱:避免数据意外修改的策略Java中ArrayList引用传递陷阱:避免数据意外修改的策略

    本文探讨了Java中ArrayList作为引用类型在对象构造时可能导致的数据意外修改问题。当将同一个ArrayList实例传递给多个对象后,对该列表的后续操作(如清空或添加元素)会影响所有引用它的对象。核心解决方案是为每个需要独立数据副本的对象,实例化一个新的ArrayList,从而确保数据隔离和一…

    2026年9月28日 • 用户投稿
    100
  • Java集合引用管理:确保对象创建时内部列表状态独立的策略

    Java集合引用管理:确保对象创建时内部列表状态独立的策略Java集合引用管理:确保对象创建时内部列表状态独立的策略Java集合引用管理:确保对象创建时内部列表状态独立的策略Java集合引用管理:确保对象创建时内部列表状态独立的策略

    本教程探讨Java中将集合作为参数传递给构造函数时,如何避免因引用共享导致的内部数据意外更改问题。当多个对象共享同一个可变集合实例,并在外部修改该集合时,所有引用该集合的对象都会受影响。文章将详细介绍通过创建新集合实例或进行防御性复制两种有效策略,确保每个对象拥有独立且稳定的内部数据状态。 问题背景…

    2026年9月28日 • 用户投稿
    200
  • sublime怎么配置clangd进行c++代码补全_Clangd插件C++环境配置

    sublime怎么配置clangd进行c++代码补全_Clangd插件C++环境配置sublime怎么配置clangd进行c++代码补全_Clangd插件C++环境配置sublime怎么配置clangd进行c++代码补全_Clangd插件C++环境配置sublime怎么配置clangd进行c++代码补全_Clangd插件C++环境配置

    配置Clangd实现C++智能补全,需安装LSP插件和Clangd服务器,并通过compile_commands.json告知编译信息,从而获得语义级代码补全、实时诊断与重构支持,显著提升Sublime Text的C++开发体验。 在Sublime Text里配置Clangd来搞定C++代码补全,说…

    2026年9月28日 • 用户投稿
    100
  • 深入理解Java泛型:类型参数与方法重载的实践指南

    深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南

    本文深入探讨了Java泛型中关于类型参数与泛型类实例在方法签名中的区别,以及由此引发的类型不匹配问题。通过一个具体的代码示例,详细解析了为何在泛型方法中,直接传入泛型类实例或其内部类型参数会引发编译错误,并提供了利用方法重载这一核心机制来优雅地解决此类问题的专业指导和示例代码,帮助开发者清晰理解“h…

    2026年9月28日 • 用户投稿
    200
  • 如何通过服务禁用减少系统启动时间?

    如何通过服务禁用减少系统启动时间?如何通过服务禁用减少系统启动时间?如何通过服务禁用减少系统启动时间?如何通过服务禁用减少系统启动时间?

    精简开机自启动服务可显著缩短系统启动时间。通过禁用非必要的第三方或冗余服务,减轻系统引导负担,释放CPU、内存等资源,提升整体响应速度与电池续航。在Windows中使用services.msc或任务管理器管理服务与启动项,Linux下则用systemctl命令控制服务启停。操作时应从第三方软件入手,…

    2026年9月28日 • 用户投稿
    300
  • ROG Xbox Ally和ROG Xbox Ally X将于10月16日发售

    ROG Xbox Ally和ROG Xbox Ally X将于10月16日发售ROG Xbox Ally和ROG Xbox Ally X将于10月16日发售ROG Xbox Ally和ROG Xbox Ally X将于10月16日发售ROG Xbox Ally和ROG Xbox Ally X将于10月16日发售

    微软与华硕联手打造的windows掌机rog xbox ally及高端型号rog xbox ally x确认将于2025年10月16日正式发售,为全球玩家带来全新的掌上游戏体验。据悉,该系列掌机将在8月20日科隆游戏展期间开启预售,届时玩家也有机会在现场近距离体验这款设备。 此次发布的ROG Xbo…

    2026年9月28日 • 用户投稿
    100
  • 联发科发布天玑7360处理器 定位中端 A78+A55架构

    联发科发布天玑7360处理器 定位中端 A78+A55架构联发科发布天玑7360处理器 定位中端 A78+A55架构联发科发布天玑7360处理器 定位中端 A78+A55架构联发科发布天玑7360处理器 定位中端 A78+A55架构

    近日,联发科正式发布了全新的中端移动平台——天玑7360,进一步拓展其5g芯片产品布局。这款芯片在核心架构上延续了前代天玑7300的技术路线,并未进行彻底重构,而是聚焦于性能调优与功能升级。 天玑7360搭载八核CPU设计,配备四颗最高主频达2.5GHz的Arm Cortex-A78高性能核心,另配…

    2026年9月28日 • 用户投稿
    200
  • 为什么高负载下CPU频率会自动降低?

    为什么高负载下CPU频率会自动降低?为什么高负载下CPU频率会自动降低?为什么高负载下CPU频率会自动降低?为什么高负载下CPU频率会自动降低?

    CPU在高负载下频率降低是因温度或功耗过高触发的自我保护机制,主要由散热不足或功耗限制导致。当CPU温度接近Tj Max时,电源管理单元会启动热节流,通过降频降温;同样,若瞬时功耗超过PL1/PL2阈值,也会触发功耗墙降频。此机制虽保障硬件安全,但会导致性能下降,表现为游戏卡顿、渲染变慢等。可通过H…

    2026年9月28日 • 用户投稿
    300
  • Intel劝你选酷睿Ultra 200S:游戏性价比超锐龙9000!

    Intel劝你选酷睿Ultra 200S:游戏性价比超锐龙9000!Intel劝你选酷睿Ultra 200S:游戏性价比超锐龙9000!Intel劝你选酷睿Ultra 200S:游戏性价比超锐龙9000!Intel劝你选酷睿Ultra 200S:游戏性价比超锐龙9000!

    9月26日资讯,在当前处理器市场的激烈竞争中,intel与amd正积极争取消费者的青睐。 近期,Intel推出了一份宣传资料,将其最新推出的Arrow Lake桌面级CPU与AMD的锐龙9000系列进行对比,旨在突出自身产品的优势。 该资料详细列出了Intel Core Ultra 200S系列(即…

    2026年9月28日 • 用户投稿
    800
  • Intel最强游戏CPU要涨价了!13/14代酷睿上涨超10%

    Intel最强游戏CPU要涨价了!13/14代酷睿上涨超10%Intel最强游戏CPU要涨价了!13/14代酷睿上涨超10%Intel最强游戏CPU要涨价了!13/14代酷睿上涨超10%Intel最强游戏CPU要涨价了!13/14代酷睿上涨超10%

    9月26日消息,据最新报道,intel拟上调其第13代和第14代酷睿(raptor lake)桌面处理器的售价,涨幅或将超过10%。 据悉,此次调价可能与供应链紧张及AI PC市场需求疲软有关。自2022年10月发布以来,Raptor Lake系列一直担当Intel产品线的主力角色。 尽管该系列已属…

    2026年9月28日 • 用户投稿
    200
  • sublime怎么设置字体渲染_Sublime字体抗锯齿与渲染效果优化

    sublime怎么设置字体渲染_Sublime字体抗锯齿与渲染效果优化sublime怎么设置字体渲染_Sublime字体抗锯齿与渲染效果优化sublime怎么设置字体渲染_Sublime字体抗锯齿与渲染效果优化sublime怎么设置字体渲染_Sublime字体抗锯齿与渲染效果优化

    启用ClearType提升Windows下字体清晰度;2. 在Sublime中设置合适字体与subpixel_antialias;3. 避免非整数缩放防模糊;4. 可选Fira Code连字字体优化可读性。 Sublime Text 的字体渲染效果直接影响编码体验,清晰锐利的字体能减轻视觉疲劳。默认…

    2026年9月28日 • 用户投稿
    100
  • 华为技术专家居然把JVM内存模型讲解这么细致「建议收藏」

    华为技术专家居然把JVM内存模型讲解这么细致「建议收藏」华为技术专家居然把JVM内存模型讲解这么细致「建议收藏」华为技术专家居然把JVM内存模型讲解这么细致「建议收藏」华为技术专家居然把JVM内存模型讲解这么细致「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着os和应用程序的实时运行。 JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM高效稳定运行。不同JVM对于内存的划分方式和管理机制存在差异。结合JVM虚拟机规范,来…

    2026年9月28日 • 用户投稿
    200
  • 苹果16promax有什么升级

    苹果16promax有什么升级苹果16promax有什么升级苹果16promax有什么升级苹果16promax有什么升级

    苹果 16 Pro Max 主要针对以下方面升级:性能提升:搭载 A16 Bionic 芯片,提升 40% 性能,降低 20% 功耗。相机增强:4800 万像素主摄像头,2 倍光学变焦长焦镜头,光像引擎和计算摄影增强。屏幕升级:始终显示屏,2000 尼特亮度,ProMotion 自适应刷新率。电池续…

    2026年9月28日 • 用户投稿
    100
  • 苹果16pro和max区别

    苹果16pro和max区别苹果16pro和max区别苹果16pro和max区别苹果16pro和max区别

    主要区别在于:尺寸和显示屏:16 Pro 为 6.1 英寸,而 16 Pro Max 为 6.7 英寸,均采用 ProMotion 显示屏。电池续航:16 Pro 可播放 23 小时视频,而 16 Pro Max 可播放 29 小时。摄像头:均拥有 48MP 主摄像头,但 16 Pro Max 具有…

    2026年9月27日 • 用户投稿
    200
  • 高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单

    高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单

    在骁龙峰会2025上,高通高级副总裁don mcguire表示,最新调研显示,84%的消费者认为搭载骁龙处理器的笔记本表现出色,具备强大性能;同时,95%的用户愿意为配备骁龙移动平台的高端智能手机支付更高价格。 据CNMO了解,骁龙品牌在多个市场已展现出强劲影响力。根据CyberMedia Rese…

    2026年9月27日 • 用户投稿
    100
  • 雷鸟手机(雷鸟手机)

    雷鸟手机(雷鸟手机)雷鸟手机(雷鸟手机)雷鸟手机(雷鸟手机)雷鸟手机(雷鸟手机)

    随着智能手机的日益普及,人们对于手机品牌的要求也越来越高。雷鸟手机作为一家新兴的手机品牌,在市场上取得了显著的成绩。本文将从雷鸟手机的品牌介绍、产品特点、技术创新、用户口碑等多个方面进行详细的介绍。 降重鸟 要想效果好,就用降重鸟。AI改写智能降低AIGC率和重复率。 113 查看详情 一、雷鸟手机…

    2026年9月27日 • 用户投稿
    100
  • 电脑内存超过 4GB,安装 32 位系统和 64 位系统有什么区别?

    电脑内存超过 4GB,安装 32 位系统和 64 位系统有什么区别?电脑内存超过 4GB,安装 32 位系统和 64 位系统有什么区别?电脑内存超过 4GB,安装 32 位系统和 64 位系统有什么区别?电脑内存超过 4GB,安装 32 位系统和 64 位系统有什么区别?

    64位系统能充分利用大内存并提升性能与安全性。当内存超过4GB时,32位系统受限于4GB寻址上限,仅能使用约3.5GB,造成资源浪费;而64位系统可完全利用8GB、16GB等大内存,显著提升多任务处理和运行效率。此外,64位架构支持更宽数据总线、更多寄存器及SSE/AVX指令集,增强计算能力,尤其利…

    2026年9月27日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信