ES6 中实现类的私有变量的多种方法详解

版权申诉
0 下载量 59 浏览量 更新于2024-08-20 收藏 17KB DOCX 举报
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 序列化。开发者可以根据实际情况选择合适的方法来实现类的私有变量。