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/setstatic 成员,不能写普通变量或表达式
  • 所有方法默认不可枚举(enumerable: false),这点和手动挂到 prototype 上一致
  • 类内部不支持私有字段语法(如 #private)在旧环境会直接报错,需确认目标运行时是否支持

extendssuper() 实现继承时,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 类继承:关键差异在 instanceofObject.getPrototypeOf()

class 定义的继承,底层仍靠修改 [[Prototype]] 链,所以 instanceofObject.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 语法完全不支持,必须退回普通函数

复杂点不在语法多难记,而在你是否清楚每个 newextendssuper 背后触发了哪些原型操作。


# 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令牌过期处理