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 】
相关推荐:
如何快速搭建高效香港服务器网站?
网站制作免费,什么网站能看正片电影?
如何快速搭建安全的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布局继承用法


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