javascript中的类与继承是如何实现的【教程】

发布时间 - 2026-01-27 00:00:00    点击率:
JavaScript的类是基于原型的语法糖,class声明本质是函数加prototype操作,实例属性须在constructor中用this显式初始化,继承必须正确调用super()以维护原型链。

JavaScript 的类和继承不是传统面向对象语言那种“编译时确定的类型系统”,而是基于原型(prototype)的语法糖——class 关键字本身不创建新机制,只是让原型链操作更可读、更结构化。

class 声明本质是函数 + prototype 操作

class 声明会被 JavaScript 引擎转为一个具有 constructor 属性的函数,并自动设置其 prototype。你不能在 class 内部用 = 直接给实例赋值成员变量(像 Python 那样),所有实例属性必须在 constructor 中通过 this.xxx = 显式初始化。

  • class Person {} 等价于 function Person() {},且 Person.prototype 自动存在
  • 类方法(如 sayHello())被添加到 Person.prototype 上,不是每个实例都拷贝一份
  • 类中不允许写 var name = 'xxx' 这样的语句;静态属性需用 Person.version = 1static version = 1(ES2025+)

extends 和 super 的调用顺序很关键

子类构造函数中,必须在访问 this 前调用 super()——否则会抛出 ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor。这是因为子类实例的内部槽([[Protot

ype]])依赖 super() 来正确链接到父类原型。

  • super() 必须出现在 constructor 第一行(或至少在任何 this 访问之前)
  • super.xxx 可用于访问父类原型上的方法,但不能在 super() 调用前使用
  • 如果子类没写 constructor,引擎会自动注入 constructor(...args) { super(...args); }

继承链断裂常见于手动改写 prototype

直接赋值 Child.prototype = Parent.prototypeChild.prototype = new Parent() 是危险操作:前者会让子类修改影响父类,后者可能触发父类构造函数副作用(比如发请求、改全局状态),且无法正确设置 constructor 指针和 __proto__ 链。

  • 正确做法始终是用 extends,它底层调用 Object.setPrototypeOf(Child.prototype, Parent.prototype)
  • 若必须手写继承(如兼容老环境),应使用 Object.create(Parent.prototype) 并重设 constructor
  • instanceof 判断依赖原型链,手动改错 prototype 会导致 new Child() instanceof Parent === false

真正容易被忽略的是:类字段声明(name = 'x')属于 ES2025 提案,Babel 默认不编译它为可兼容代码;而 static 字段、私有字段(#age)的运行时行为与普通属性完全不同——它们不走 prototype,也不参与 for...in 遍历。别假设“写了 class 就等于 Java 那套”。


# javascript  # python  # java  # access  # Static  # Object  # for  # 面向对象  # 成员变量  # 父类  # 子类  # 构造函数  # 指针  # 继承  # class  # var  # function  # 对象  # constructor  # this  # prototype  # 能在  # 的是  # 也不  # 出现在  # 遍历  # 你不  # 会让  # 写了  # 但不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用JavaScript实现文本编辑器_光标和选区怎么处理  如何正确选择百度移动适配建站域名?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  微信小程序 scroll-view组件实现列表页实例代码  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  js代码实现下拉菜单【推荐】  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  详解jQuery中基本的动画方法  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  音响网站制作视频教程,隆霸音响官方网站?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  如何用花生壳三步快速搭建专属网站?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  Laravel怎么使用Intervention Image库处理图片上传和缩放  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  jQuery 常见小例汇总  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Python高阶函数应用_函数作为参数说明【指导】  如何用搬瓦工VPS快速搭建个人网站?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  新三国志曹操传主线渭水交兵攻略  如何获取上海专业网站定制建站电话?  Laravel如何配置任务调度?(Cron Job示例)  微信小程序 input输入框控件详解及实例(多种示例)  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  无锡营销型网站制作公司,无锡网选车牌流程?  如何用PHP快速搭建高效网站?分步指南  如何彻底删除建站之星生成的Banner?  网站制作软件有哪些,制图软件有哪些?  高端建站三要素:定制模板、企业官网与响应式设计优化  如何在VPS电脑上快速搭建网站?  如何快速搭建高效香港服务器网站?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  如何快速搭建支持数据库操作的智能建站平台?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  如何在景安云服务器上绑定域名并配置虚拟主机?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  canvas 画布在主流浏览器中的尺寸限制详细介绍  如何在局域网内绑定自建网站域名?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  JavaScript中的标签模板是什么_它如何扩展字符串功能  大型企业网站制作流程,做网站需要注册公司吗?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  如何快速生成橙子建站落地页链接?  5种Android数据存储方式汇总