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 独有(仅声明文件)

终极避坑大总结(把最乱的理清楚)

  1. private(TS) 和 #(JS) 的区别

    • 用 private:编译成 JS 后变成 this.name,浏览器控制台能打印出来(假私有)。

    • 用 #:编译成 JS 后依然是 this.#name,浏览器底层锁死(真私有)。

    • 结论:如果你写 .js 文件,只能选 #;如果写 .ts 文件,追求真安全也选 #,图省事可选 private

  2. abstract 和 protected 的区别

    • protected 是“让儿子用”(值/方法传给儿子)。

    • abstract 是“逼儿子写”(儿子必须自己补全逻辑)。

  3. static 和 readonly 能连用吗?

    • 能!比如 static readonly COMPANY_NAME = '腾讯'; 意思就是“属于类的、且永远不许改的常量”。


最后送你一句全涵盖的顺口溜(背下这一句,横扫面试题)

原生 JS 有 static 和 #,真锁假锁分开拿;
TS 保镖 public 是默认,private 防外不防儿(子类也防),
protected 传儿不传外,readonly 写完不能改,
abstract 监工最霸道,想 new 它?门儿都没有!
剩下 override 查错名,declare 只管拍胸脯。

现在你是真正的“修饰符全栈通”了!😎

posted @ 2026-07-01 14:39  小囧光  阅读(3)  评论(0)    收藏  举报