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

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

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

function Constructor(param){
    var that = this;
    var private = //..
    this.public = //..
    
    this.method = function () {
        console.log(private);
        console.log(this.public);
    }
}

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

但是使用 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);
         }
     }();
 }

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

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


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

class {
	#private = //..
	constructor() {
	     this.public = param;
	 }
	 method(){
	     console.log(this.#private);
	     console.log(this.public);
	 }
}
posted @ 2020-04-07 14:34  高厉害  阅读(1053)  评论(0编辑  收藏  举报