class修饰符速查表
总共就 7 个半(算上高级的),我把它们分成 “原生铁锁” 和 “TS保镖” 两派,你记起来绝对不乱。
第一派:JS 原生自带的“真家伙”(运行时也管用)
这俩是 ECMAScript 官方标准,浏览器和 Node.js 直接认,写 .js 文件也能用。
| 修饰符 | 大白话解释 | 作用于谁? | 能不能用于 .js 文件? |
|---|---|---|---|
# (私有字段) |
“内衣兜里的银行卡”。只有类内部自己能用,外面、亲儿子都碰不到。这是 JS 真正的铁锁。 | 属性 + 方法 | ✅ 能 |
static (静态) |
“工厂大门上的招牌”。属于类本身(图纸),不属于 new 出来的实例(实物)。直接用 类名.xxx 调用。 |
属性 + 方法 | ✅ 能 |
第二派:TypeScript 独有的“编译期保镖”(写代码时吓唬人)
这 5 个是 TS 加的,写在 .ts 文件里才有效。一旦编译成 .js,它们会被删得干干净净,运行时完全消失。
| 修饰符 | 大白话解释 | 作用于谁? | 能不能用于 .js 文件? |
|---|---|---|---|
public (公有) |
“广场大屏幕”。谁都能看能改。其实默认就是它,你不写修饰符就等于写了它,纯属为了代码清晰。 | 属性 + 方法 | ❌ 不能 |
private (TS私有) |
“带锁的日记本”。只有类内部能碰,亲儿子(子类)也看不见。(注意:这是TS的假锁,编译后变普通属性) | 属性 + 方法 | ❌ 不能 |
protected (受保护) |
“家族传家宝”。类内部能用,亲儿子(子类)内部也能用,但外面的路人对象不能用。 | 属性 + 方法 | ❌ 不能 |
readonly (只读) |
“刻在石碑上的字”。只能在定义时或构造函数里赋值一次。实例化之后,谁敢改就报错。 | 属性 | ❌ 不能 |
abstract (抽象) |
“霸王条款监工”。写在类前面,这个类就不能 new;写在方法前面,所有子类必须强制实现这个方法,少写一个就报错。 |
类 + 方法 | ❌ 不能 |
第三派:两个“进阶隐藏款”(面试装X必备)
这俩不常用,但大厂面试或者读源码时会见到,给你提一嘴涨涨见识。
| 修饰符 | 大白话解释 | 属于谁? |
|---|---|---|
override |
“确认覆盖”。子类重写父类方法时加上它,TS 会帮你检查:如果父类根本没这个方法,或者名字拼错了,TS 就报错提醒你。防止你本想覆盖,结果写成了新方法。 | TS 独有(4.3+版本) |
declare |
“我发誓外面有”。用在 .d.ts 声明文件里,告诉 TS:“这个类/属性在别的地方(比如浏览器全局变量)已经存在了,你别检查报错,信我就行了。” |
TS 独有(仅声明文件) |
终极避坑大总结(把最乱的理清楚)
-
private(TS) 和#(JS) 的区别:-
用
private:编译成 JS 后变成this.name,浏览器控制台能打印出来(假私有)。 -
用
#:编译成 JS 后依然是this.#name,浏览器底层锁死(真私有)。 -
结论:如果你写
.js文件,只能选#;如果写.ts文件,追求真安全也选#,图省事可选private。
-
-
abstract和protected的区别:-
protected是“让儿子用”(值/方法传给儿子)。 -
abstract是“逼儿子写”(儿子必须自己补全逻辑)。
-
-
static和readonly能连用吗?-
能!比如
static readonly COMPANY_NAME = '腾讯';意思就是“属于类的、且永远不许改的常量”。
-
最后送你一句全涵盖的顺口溜(背下这一句,横扫面试题)
原生 JS 有
static和#,真锁假锁分开拿;
TS 保镖public是默认,private防外不防儿(子类也防),protected传儿不传外,readonly写完不能改,abstract监工最霸道,想new它?门儿都没有!
剩下override查错名,declare只管拍胸脯。
现在你是真正的“修饰符全栈通”了!😎

浙公网安备 33010602011771号