为何无法在JavaScript类的静态初始化块中设置构造函数name属性?
类静态字段与静态初始化块修改name属性的差异是规范预期行为吗?
这是ECMAScript规范的预期行为,并非意外特性,核心原因在于两者的执行时机和规范对name属性的只读标记时机不同:
- 类构造函数的
name属性本质是只读的,但静态字段的初始化时机更早:在类构造函数被创建后、name属性被标记为只读之前,静态字段就已经完成赋值。此时修改name相当于覆盖默认值,不会触发只读限制。 - 静态初始化块则是在所有静态字段初始化完成后才执行的,这时构造函数的
name属性已经被规范设置为只读状态,直接赋值自然会抛出TypeError。
可行代码示例
class Foo { static name = 'Bar'; } console.log(Foo.name); // 输出 "Bar"
报错代码示例
class Foo { static { this.name = 'Bar'; } } // 抛出 TypeError: Cannot assign to read only property 'name' of function 'Foo()'
内容的提问来源于stack exchange,提问作者Ryan Grove
相关产品推荐
相关产品推荐

