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


相关推荐: Laravel怎么在Controller之外的地方验证数据  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  如何在IIS服务器上快速部署高效网站?  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  PythonWeb开发入门教程_Flask快速构建Web应用  如何用IIS7快速搭建并优化网站站点?  如何快速重置建站主机并恢复默认配置?  如何在建站之星网店版论坛获取技术支持?  奇安信“盘古石”团队突破 iOS 26.1 提权  高端云建站费用究竟需要多少预算?  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  历史网站制作软件,华为如何找回被删除的网站?  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  详解阿里云nginx服务器多站点的配置  Linux网络带宽限制_tc配置实践解析【教程】  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何在IIS中新建站点并配置端口与IP地址?  EditPlus中的正则表达式 实战(4)  利用vue写todolist单页应用  Laravel如何使用模型观察者?(Observer代码示例)  Python数据仓库与ETL构建实战_Airflow调度流程详解  Internet Explorer官网直接进入 IE浏览器在线体验版网址  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  C#如何调用原生C++ COM对象详解  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Laravel如何使用Blade模板引擎?(完整语法和示例)  详解Android中Activity的四大启动模式实验简述  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  如何在IIS中新建站点并解决端口绑定冲突?  Python函数文档自动校验_规范解析【教程】  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  Laravel如何实现一对一模型关联?(Eloquent示例)  如何用虚拟主机快速搭建网站?详细步骤解析  如何用PHP工具快速搭建高效网站?  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  JavaScript中的标签模板是什么_它如何扩展字符串功能  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  JS碰撞运动实现方法详解  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  Laravel如何升级到最新版本?(升级指南和步骤)