javascript中的类是如何工作的_为什么class语法本质仍是原型继承

发布时间 - 2025-12-26 00:00:00    点击率:
JavaScript 的 class 是原型继承的语法糖,本质是构造函数与原型操作,不改变对象创建模型,仅提升可读性与结构化程度。

JavaScript 中的 class 语法本质上是原型继承的语法糖,它没有引入新的面向对象机制,只是让基于原型的继承写起来更像传统 OOP 语言(如 Java、C++)。

class 声明会被编译为函数和原型操作

当你写一个 class,JS 引擎实际会把它转成一个构造函数,并把方法挂到该函数的 prototype 上。

例如:

class Person {
  constructor(name) {
    this.name = name;
  }
  sayHello() {
    return `Hello, I'm ${this.name}`;
  }
}

等价于:

function Person(name) {
  this.name = name;
}
Person.prototype.sayHello = function() {
  return `Hello, I'm ${this.name}`;
};

两者创建的对象具有完全相同的原型链结构:person.__proto__ === Person.prototypePerson.prototype.constructor === Person

所有“类方法”都定义在 prototype 上,而非实例上

这保证了方法复用——每个实例不重复创建函数,而是共享原型上的方法。

  • constructor 是一个普通函数,用于初始化实例属性
  • 其他方法(包括 static 方法)默认不会出现在实例上
  • static 方法直接挂在构造函数本身(Person.sayHi = ...),不进入原型链
  • 实例方法必须通过 prototype 访问,这是原型继承的核心机制

extends 和 super 的底层仍是原型链操作

extends 实际做了两件事:

  • 设置子类的 prototype.__proto__ 指向父类的 prototype(实现方法继承)
  • 设置子类构造函数的 __proto__ 指向父类构造函数(实现静态方法继承)

super() 在构造函数中相当于调用父类构造函数(Parent.call(this, ...));在方法中访问 super.xxx 则是通过 Object.getPrototypeOf(this).xxx 查找,本质仍是沿原型链向上查找。

new 关键字的行为从未改变

无论用函数还是 class 创建实例,new 都执行相同步骤:

  • 创建一个空对象,其 __proto__ 指向构造函数的 prototype
  • 将该对象作为 this 执行构造函数
  • 返回该对象(除非构造函数显式返回非 null 对象)

也就是说,class 并未修改 JavaScript 的对象创建模型,只是让这个过程更可读、更结构化。


# javascript  # java  # js  # c++  # 为什么 


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


相关推荐: 如何快速搭建高效香港服务器网站?  网站制作免费,什么网站能看正片电影?  如何快速搭建安全的FTP站点?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  网站图片在线制作软件,怎么在图片上做链接?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  北京专业网站制作设计师招聘,北京白云观官方网站?  高端云建站费用究竟需要多少预算?  如何在局域网内绑定自建网站域名?  Laravel如何实现一对一模型关联?(Eloquent示例)  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Laravel如何实现用户注册和登录?(Auth脚手架指南)  用v-html解决Vue.js渲染中html标签不被解析的问题  如何在宝塔面板中修改默认建站目录?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  如何在宝塔面板中创建新站点?  如何快速搭建自助建站会员专属系统?  如何彻底卸载建站之星软件?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  百度浏览器如何管理插件 百度浏览器插件管理方法  Linux后台任务运行方法_nohup与&使用技巧【技巧】  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  西安专业网站制作公司有哪些,陕西省建行官方网站?  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  如何快速使用云服务器搭建个人网站?  Laravel如何自定义错误页面(404, 500)?(代码示例)  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  如何在Windows服务器上快速搭建网站?  Laravel如何使用Vite进行前端资源打包?(配置示例)  如何快速打造个性化非模板自助建站?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  如何在景安云服务器上绑定域名并配置虚拟主机?  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  Laravel Blade模板引擎语法_Laravel Blade布局继承用法