javascript面向对象编程如何理解_类和继承怎样实现【教程】
发布时间 - 2026-01-27 00:00:00 点击率:次JavaScript 的 class 只是语法糖,未改变原型本质;它要求 super() 必须首行调用、不提升、方法不可枚举,继承仍基于 [[Prototype]] 链,核心在于对象创建时的原型关联、属性查找与 this 绑定。
JavaScript 里 class 不是“新类型”,只是语法糖
ES6 的 class 关键字没有改变 JavaScript 基于原型的本质。它只是把原本用 function + prototype 写的构造逻辑,包装成更接近传统 OOP 语言的写法。如果你试图用 Java/C# 的类模型去套,很容易在动态性、this 绑定、继承链这些地方掉坑。
实操建议:
-
class声明不会被提升(hoisted),必须先声明再使用,否则报ReferenceError - 类体内只能写方法定义、
get/set、static成员,不能写普通变量或表达式 - 所有方法默认不可枚举(
enumerable: false),这点和手动挂到prototype上一致 - 类内部不支持私有字段语法(如
#private)在旧环境会直接报错,需确认目标运行时是否支持
用 extends 和 super() 实现继承时,super() 必须调用

子类构造函数中若定义了 constructor,就必须显式调用 super(),否则会报 ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor。这不是可选项,是引擎强制的时序约束——因为子类实例的 this 依赖父类构造器初始化内部槽位(如 [[Prototype]])。
常见错误场景:
- 只写了
super()但没传参,导致父类接收不到必要参数 - 在
super()前访问this,哪怕只是console.log(this)也会立即报错 - 误以为
super.method()等价于Parent.prototype.method.call(this),其实前者在箭头函数中会丢失this绑定上下文
示例:
class Animal {
constructor(name) {
this.name = name;
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // ✅ 必须且必须在第一行
this.breed = breed;
}
}原型链继承 vs 类继承:关键差异在 instanceof 和 Object.getPrototypeOf()
用 class 定义的继承,底层仍靠修改 [[Prototype]] 链,所以 instanceof 和 Object.getPrototypeOf() 的行为和手写原型链一致。但有个易忽略点:子类的 constructor 属性默认指向自身,而它的 prototype 对象的 constructor 会被自动设为子类——这个自动修正只发生在 class 语法中,手动操作 prototype 时得自己补。
影响实际开发的细节:
- 用
new Dog()创建的实例,Object.getPrototypeOf(new Dog()) === Dog.prototype,而Object.getPrototypeOf(Dog.prototype) === Animal.prototype - 如果子类重写了静态方法,比如
static create(),它不会自动调用父类同名静态方法,必须显式写super.create() - 子类无法直接继承父类的实例属性(如
this.id = Math.random()),只能通过super()触发父类构造器执行来获得
真正需要关注的不是“怎么写类”,而是“对象创建时发生了什么”
JavaScript 面向对象的核心从来不是语法,而是三件事:对象如何关联原型、属性查找如何沿链进行、方法调用时 this 如何绑定。类语法掩盖了这些过程,反而容易让人忽略 Object.create(null)、Object.setPrototypeOf()、Reflect.construct() 这些底层机制的存在价值。
比如你遇到以下情况,就得跳出 class 思维:
- 需要创建一个无原型的对象(避免继承
Object.prototype方法) - 运行时动态改变某个实例的原型(
__proto__已废弃,该用Object.setPrototypeOf()) - 想让构造函数返回非默认对象(比如缓存已有实例),这时
class语法完全不支持,必须退回普通函数
复杂点不在语法多难记,而在你是否清楚每个 new、extends、super 背后触发了哪些原型操作。
# javascript
# es6
# java
# access
# 面向对象编程
# c#
# Static
# Object
# NULL
# 面向对象
# 父类
# 子类
# 构造函数
# math
# 继承
# class
# private
# console
# function
# 对象
# constructor
# this
# prototype
# 绑定
# 写了
# 不支持
# 报错
# 会报
# 如果你
# 让人
# 也会
# 有个
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在Ubuntu系统下快速搭建WordPress个人网站?
手机软键盘弹出时影响布局的解决方法
,交易猫的商品怎么发布到网站上去?
Laravel Fortify是什么,和Jetstream有什么关系
phpredis提高消息队列的实时性方法(推荐)
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Laravel怎么为数据库表字段添加索引以优化查询
简单实现Android文件上传
jQuery中的100个技巧汇总
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
Laravel定时任务怎么设置_Laravel Crontab调度器配置
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
用yum安装MySQLdb模块的步骤方法
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
三星网站视频制作教程下载,三星w23网页如何全屏?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
如何用PHP快速搭建CMS系统?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
JavaScript Ajax实现异步通信
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
如何在IIS中配置站点IP、端口及主机头?
中山网站推广排名,中山信息港登录入口?
Laravel如何自定义分页视图?(Pagination示例)
原生JS获取元素集合的子元素宽度实例
Laravel Session怎么存储_Laravel Session驱动配置详解
Android自定义控件实现温度旋转按钮效果
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
WEB开发之注册页面验证码倒计时代码的实现
Android实现代码画虚线边框背景效果
微信小程序 input输入框控件详解及实例(多种示例)
清除minerd进程的简单方法
如何撰写建站申请书?关键要点有哪些?
Laravel如何使用Collections进行数据处理?(实用方法示例)
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
如何在阿里云ECS服务器部署织梦CMS网站?
如何将凡科建站内容保存为本地文件?
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
如何续费美橙建站之星域名及服务?
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理

