javascript中class的name属性是只读字符串,自动设为类声明或表达式中的标识符名称,区分大小写且不可修改;匿名类表达式name为空字符串,命名类表达式取内部名;子类name不继承父类,与constructor.name一致;但压缩或混淆可能改变name,故不应依赖其做关键逻辑判断。

JavaScript 中 class 的 name 属性是只读字符串,自动设为类声明或类表达式中的标识符名称,用于标识该类的名称。
class 声明中的 name 属性
使用 class ClassName { ... } 语法声明类时,ClassName.name 会返回字符串 "ClassName"。这个值在定义时确定,不可修改。
- 名称严格匹配声明时的标识符,区分大小写
- 即使将类赋值给其他变量,
name仍保持原始名称 - 例如:
class Person {}→Person.name === "Person"
class 表达式中的 name 属性
匿名类表达式(如 const C = class { };)的 name 是空字符串;命名类表达式(如 const C = class Klass { };)的 name 是内部名称 "Klass",而非变量名 C。
const A = class {}; console.log(A.name); // ""const B = class MyB {}; console.log(B.name); // "MyB"- 该名称可用于调试、序列化或运行时类型识别
name 属性与继承和构造函数的关系
子类的 name 属性反映其自身声明名,不继承父类名称;它与 constructor.name 完全一致,因为 class 的 constructor 就是类本身。
-
class Child extends Parent {}→Child.name === "Child" new Child().constructor.name === "Child"- 箭头函数或普通函数没有
name的强制语义,但 class 的name是语言规范明确保证的
实际使用注意事项
虽然 name 看似简单,但在动态导入、模块封装或框架反射场景中容易被忽略。
- Tree-shaking 或混淆工具可能重命名类,导致
name改变(如压缩后变为"a") - 不要依赖
name进行关键逻辑判断(如权限控制),因其非运行时可靠标识 - 可通过
Object.defineProperty尝试修改,但会被忽略(严格模式下静默失败)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











