JavaScript类用法全解析【教程】
时间:2026-03-01 15:37:06 387浏览 收藏
JavaScript中的class并非传统面向对象语言中的真正类,而是基于函数和原型链的语法糖,其本质仍是函数,不支持提升,要求constructor必须显式且唯一、继承时必须优先调用super(),静态方法绑定类本身、实例方法绑定原型、getter/setter提供属性式访问,同时严禁在类体中使用箭头函数;理解这些底层机制与语义边界,才能避免常见陷阱(如this引用错误、异步构造、原型污染),写出清晰、健壮、可维护的现代JavaScript代码。

JavaScript 用 class 关键字实现的不是传统意义上的类,而只是函数和原型链的语法糖——它不改变底层机制,但能让你写得更清晰、更少出错。
class 声明本质是函数,不是新类型
你写的 class Person 在运行时会被转成一个普通函数,并挂载到 Person.prototype 上。这意味着:
typeof Person返回"function",不是"class"- 不能用
new Person()之前就调用Person(),否则报TypeError: Class constructor Person cannot be invoked without 'new' - 类体中所有方法默认不可枚举(
Object.keys(Person.prototype)拿不到),但手动加的属性(如this.name = name)会出现在实例上
constructor 必须显式定义,且只能有一个
如果你没写 constructor,JS 会自动插入一个空的;但一旦写了,就不能再写第二个,否则报 SyntaxError: A class may only have one constructor。
常见误用:
- 在
constructor里忘记调用super()(继承时),直接访问this会触发ReferenceError: Must call super constructor in derived class before accessing 'this' - 把异步操作(如
await fetch())直接塞进constructor——它不能是async,必须同步完成初始化
示例:
class User {
constructor(name) {
this.name = name;
}
}
class Admin extends User {
constructor(name, role) {
super(name); // 必须第一行
this.role = role;
}
}
静态方法、实例方法、getter/setter 的位置很关键
它们都写在 class 大括号内,但语义和绑定对象完全不同:
static init()→ 绑定在类本身:User.init(),不能通过实例调用getName()(无static)→ 绑定在原型上:new User().getName()get id()→ 访问时像属性:user.id,但背后执行函数
注意:箭头函数不能用作类方法(包括 static),因为它没有自己的 this 绑定,且语法不允许出现在类体顶层(会报 Unexpected token)。
extends 和 instanceof 的行为依赖原型链,不是字符串匹配
class A extends B 实际做了两件事:设置 A.prototype.__proto__ === B.prototype,并让 A.__proto__ === B(静态继承)。所以:
new A() instanceof B是true,因为原型链向上能找到B.prototype- 但
Object.getPrototypeOf(A) !== B,而是A.__proto__ === B—— 这个细节影响工具库(比如Reflect.getPrototypeOf(A))的行为 - 如果父类是函数(非 class),
extends仍可工作,但子类constructor中的super()必须显式调用父函数,且不能省略括号
容易忽略的一点:class 声明不会被提升(hoisting),不像函数声明。下面代码会报 ReferenceError:
let u = new User(); // ❌
class User { }
真正难处理的不是语法,而是混用 class 和原型操作时的隐式耦合——比如在 class 外改 User.prototype.method = ...,或者用 Object.assign(User.prototype, {...}) 扩展方法,这些都能跑通,但会让代码意图模糊、难以调试。
到这里,我们也就讲完了《JavaScript类用法全解析【教程】》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
139 收藏
-
467 收藏
-
240 收藏
-
414 收藏
-
316 收藏
-
290 收藏
-
213 收藏
-
186 收藏
-
352 收藏
-
156 收藏
-
416 收藏
-
154 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习