new instance field语法等价性与类内变量提升规则问询
两段代码运行效果完全不一致
第一段代码用的是ES2022标准的公共实例字段语法:
class Range2 { default = 77; constructor(from, to) { this.from = from; this.to = to; } }
这里的default = 77等价于在构造函数最开头隐式执行this.default = 77,77会作为自有属性挂载到每个Range2实例上,运行无报错。
第二段代码逻辑完全不同:
class Range2 { constructor(from, to) { this.from = from; this.to = to; default = 77; } }
类内部默认运行在严格模式下,未声明变量直接赋值会直接抛出ReferenceError: default is not defined;即使关闭严格模式,赋值的也是全局作用域的default变量,和Range2实例没有任何关联。
类字段不存在提升
类内函数外定义的所有实例/静态字段都没有提升特性,无法在字段声明的位置之前访问该字段。
公共实例字段语法运行规则
- 初始化时机:父类构造函数执行完毕后、当前类构造函数执行前触发初始化,按照类内字段声明的从上到下顺序依次执行
- 上下文指向:实例字段初始化时
this指向当前正在创建的类实例;如果加了static前缀声明为静态字段,this指向类本身 - 默认值规则:仅声明未赋值的字段,默认值为
undefined - 作用域规则:字段初始化处于类的专属作用域,可直接访问类的私有属性、静态属性,无法访问构造函数内部的局部变量
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

