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.prototype,Person.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如何升级到最新版本?(升级指南和步骤)


return `Hello, I'm ${this.name}`;
}
}