为什么在JavaScript类中用this声明属性时不需要加const或let?
在JavaScript类构造函数中给
this声明属性不需要let/const的核心原理 - 首先要明确两套完全独立的语法逻辑:
let/const是局部变量声明语法,作用是在当前块级作用域中声明独立变量,变量存储在当前执行上下文的变量环境中,不属于任何对象的属性;而this.xxx = xxx是对象属性赋值操作,this指代当前类的实例对象,操作本质是给这个对象新增/修改属性,和变量声明没有任何关系,自然不需要使用变量声明关键字。 - 其次是ECMAScript语法规范的强制要求:
let/const关键字后只能跟随合法的标识符(也就是符合变量命名规则的字符串,只能由字母、数字、下划线、$组成,且不能以数字开头),而this.area属于「成员访问表达式」,不是合法的标识符,所以const this.area = xxx、let this.widthScaled这类写法从语法解析层面就会直接报错,完全不符合JS的语法规则。
如果你想要实现实例属性不可修改的类似const的效果,可以通过Object.defineProperty定义属性:
class Rectangle { constructor(width, height) { Object.defineProperty(this, 'area', { value: width * height, writable: false // 设为不可修改 }) } }
补充说明:最新的JS类字段声明语法中,可以直接在构造函数外声明实例属性,也不需要加
let/const,本质逻辑和上面一致,都是给实例对象加属性,不是声明局部变量:class Rectangle { width // 实例属性声明,不需要let/const height area constructor(width, height) { this.width = width this.height = height this.area = width * height } }
内容的提问来源于stack exchange,提问作者Phan Phan
相关产品推荐
相关产品推荐

