【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);
}
}