JavaScript 中实现类的私有变量的几种写法
在 JavaScript 中,实现类的私有变量是非常重要的,私有变量可以保护类的内部实现细节,避免外部访问和修改。ES6 中提供了多种方法来实现类的私有变量,本文将详细介绍闭包和 Symbol 两种实现方法。
闭包实现类的私有变量
闭包是一种函数作用域的概念,函数内部可以访问外部作用域的变量,而外部作用域不能访问函数内部的变量。我们可以使用闭包来实现类的私有变量。例如:
```
class Person {
constructor(name) {
let _num = 100;
this.name = name;
this.getNum = function() {
return _num;
}
this.addNum = function() {
return ++_num;
}
}
}
const tom = new Person('tom');
const jack = new Person('jack');
tom.addNum();
console.log(tom.getNum()); // 101
console.log(jack.getNum()); // 100
```
在上面的例子中,我们使用闭包来实现私有变量 `_num`,每个实例都有自己的私有变量,但是这种方法有一个缺点,就是每个实例都生成了一个新的私有变量,造成了变量不可共享的问题。
为了解决这个问题,我们可以将私有变量放在类的构造函数外面,继续使用闭包来返回这个变量。例如:
```
const Person = (function() {
let _num = 100;
return class Person {
constructor(name) {
this.name = name;
}
addNum() {
return ++_num;
}
getNum() {
return _num;
}
}
})();
const tom = new Person('tom');
const jack = new Person('jack');
tom.addNum();
console.log(tom.getNum()); // 101
console.log(jack.getNum()); // 101
```
这样,我们就可以拥有可共享和不可共享的两种私有变量。
Symbol 实现类的私有变量
Symbol 是 ES6 中引入的一种新的数据类型,Symbol 是独一无二的值,所有 Symbol 都是不同的。我们可以使用 Symbol 来创建私有变量。例如:
```
const name = Symbol('名字');
const person = {
[name]: 'www',
say() {
console.log(`name is ${this[name]}`);
}
};
person.say();
console.log(name);
```
使用 Symbol 创建的私有变量无法迭代和 JSON 序列化,这样可以保护类的内部实现细节。
闭包和 Symbol 都可以用来实现类的私有变量,但是它们有不同的特点和用法。闭包可以实现可共享和不可共享的私有变量,但是它有内存消耗的问题。Symbol 则可以创建独一无二的私有变量,但是它无法迭代和 JSON 序列化。开发者可以根据实际情况选择合适的方法来实现类的私有变量。