JavaScript 一直被诟病缺少私有变量,而在 ES6 中,我们可以通过闭包实现模拟私有变量,但这样做的性能和可读性都不是很好。在 ES9 中,JavaScript 引入了词法私有变量的概念,使得我们可以在类中方便地定义私有变量。
什么是词法私有变量?
词法私有变量是指只能在类中访问的变量,外部无法访问。这里的“词法”指的是变量的作用域是在类的定义中,而不是在类的实例中。
如何使用词法私有变量?
在 ES9 中,我们可以使用 #
符号来定义私有变量。下面是一个示例:
// javascriptcn.com 代码示例 class Person { #name; constructor(name) { this.#name = name; } getName() { return this.#name; } setName(name) { this.#name = name; } } const person = new Person('张三'); console.log(person.getName()); // 输出:张三 person.setName('李四'); console.log(person.getName()); // 输出:李四 console.log(person.#name); // 报错:SyntaxError: Private field '#name' must be declared in an enclosing class
在上面的示例中,我们定义了一个 Person
类,其中使用 #
符号定义了一个私有变量 #name
。在类的构造函数中,我们可以通过 this.#name
来给私有变量赋值。在类的方法中,我们可以通过 this.#name
来访问私有变量。注意,外部无法访问私有变量 #name
,否则会报错。
词法私有变量的优点
使用词法私有变量有以下几个优点:
更好的封装性
使用词法私有变量可以更好地封装类的内部实现,避免外部直接访问私有变量,从而提高代码的可维护性和可读性。
更好的性能
使用词法私有变量可以避免使用闭包模拟私有变量时的性能问题,因为词法私有变量是在类定义时就确定的,而不需要在每个实例中重新创建闭包。
词法私有变量的注意事项
使用词法私有变量时,需要注意以下几点:
严格模式
词法私有变量需要在严格模式下才能使用。
命名冲突
私有变量的命名不能与类的公有属性或方法重复,否则会报错。
无法继承
私有变量无法被继承,子类中无法访问父类的私有变量。
总结
ES9 中的词法私有变量为 JavaScript 引入了更好的封装性和更好的性能,使得我们可以方便地定义类中的私有变量。但需要注意的是,词法私有变量需要在严格模式下才能使用,命名不能与类的公有属性或方法重复,且无法被继承。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/657c0188d2f5e1655d6bb78a