ES6 中实现类的私有变量的多种方法详解
版权申诉
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 序列化。开发者可以根据实际情况选择合适的方法来实现类的私有变量。
221 浏览量
187 浏览量
2021-12-28 上传
189 浏览量
242 浏览量
159 浏览量
2022-01-11 上传
mmoo_python
- 粉丝: 7436
- 资源: 1万+
最新资源
- 记忆翻牌小游戏
- PC微信加密图片解密源码C#
- product-register
- ManagmentPlugin:用于管理Mindustery服务器的插件
- 图像去噪,中值,均值,双边,高斯,FFC-MSPCNN
- 行业文档-设计装置-隧道施工二衬环向钢筋步进排布装置.zip
- C# OpenCvSharp 去除字母后面的杂线 源码
- MyReactProject
- datafrog-旨在嵌入其他Rust程序的轻量级Datalog引擎-Rust开发
- U大师U盘启动盘制作工具 v1.2.0 超微版
- SassPipeline
- WordPress v5.2 RC2
- 每晚amadeus-Rust中的和谐分布式数据处理和分析。 实木复合地板postgres aws s3 cloudfront elb json csv日志hadoop hdfs箭头常见爬网-Rust开发
- 龙格库塔解微分方程,龙格库塔解微分方程组,matlab
- com.atomist:我的新项目
- Javascript_001