当前位置:   article > 正文

【JavaScript】Class 关键字创建类时如何使用私有变量_js class 私有变量

js class 私有变量

最近碰上这个问题,查了很多资料

在以往版本创建类时,我们可以轻松地使用私有变量及方法
例如:

function Constructor(param){
    var that = this;
    var private = //..
    this.public = //..
    
    this.method = function () {
        console.log(private);
        console.log(this.public);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

因为整个构造函数在一个作用域内,于是我们就可以在任意一个方法中访问到外部作用域的私有成员。

但是使用 class 关键字创建类时,构造函数和方法是分开的,而且在 class 中直接写代码也是不符合语法的,所以使用私有成员就是一件很难办到事情。
换言之,class 中的构造函数和方法的直接外部作用域就是 class 的直接外部作用域,如果在全局,那就是全局作用域,作为一个 class ,总不能让他依赖外部的作用域吧?

查资料的过程中发现很多人都在用这种方法

我随便贴两张:
在这里插入图片描述
在这里插入图片描述
它们的思路是,在 class 外部再包一层 function,然后将 class 作为闭包传递出来,这样 class 访问的直接外部作用域就是闭合的了。

我就很不理解,为什么这么多人都在说这种方法,他可是有一个很大的缺陷的:class 的外部作用域唯一,即多个实例间会公用一套私有变量。

但是我总是对自己不够自信,以为是一些神奇的机制,而我并不了解这些机制。
于是我动手试了试,发现多个实例间的确会冲突。。

我思来想去,这个思路唯一可行的办法就是,每次实例化对象时必须重新创造一个外部作用域
代码:

 function Constructor(param) {
     var that = this;
     var privateVar = //..
     var privateFun = function () {
         console.log(that);
     }
     return new class {
         constructor() {
             this.public = param;
         }

         method(){
             console.log(private);
             console.log(this.public);
         }
     }();
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

这样虽然可以解决问题,但是构建的复杂性就高了许多,而且每次实例化对象时实际上是通过一个新类来实例化的,总有占了小便宜吃大亏的感觉。

目前还没有什么好的办法,如果解决了我会回来更新,如果有大佬知道如何做到这一点,请不吝赐教。


惭愧,刚知道在新标准中已经存在私有成员的概念了,而且主流浏览器也都基本实现了

class {
	#private = //..
	constructor() {
	     this.public = param;
	 }
	 method(){
	     console.log(this.#private);
	     console.log(this.public);
	 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/63535
推荐阅读
相关标签
  

闽ICP备14008679号