【JavaScript源代码】详解ES6实现类的私有变量的几种写法.docx
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
详解ES6实现类的私有变量的几种写法 闭包实现类的私有变量方式 通过 new 关键字 person 的构造函数内部的 this 将会指向 Tom,开辟新空间,再次全部执行一遍, class Person{ constructor(name){ let _num = 100; this.name = name; this.getNum = function(){ return _num; } this.addNum = function(){ return ### JavaScript ES6 实现类的私有变量方法详解 #### 一、背景介绍 随着ECMAScript 2015(通常称为ES6)的引入,JavaScript语言经历了一次重大更新,提供了许多新特性和改进,其中包括对面向对象编程的支持增强。其中一项重要的功能是类的定义与使用。在面向对象编程中,私有变量是一种常见的概念,它指的是只能在类内部访问的变量。ES6中并没有直接提供原生的私有变量支持,但是可以通过一些技巧来模拟这种行为。 #### 二、闭包实现类的私有变量 闭包是一种能够访问并记住其外部作用域变量的函数。利用闭包特性,我们可以在类内部定义私有变量。这种方式下,私有变量对于类的外部是不可见的,但可以通过特定的方法访问。 ##### **2.1 基础闭包实现** 考虑以下示例: ```javascript 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 ``` 在这个例子中,每个`Person`实例都有自己的`_num`私有变量副本,这意味着它们之间不会相互影响。 ##### **2.2 共享闭包实现** 为了实现多个实例间共享同一个私有变量,可以将闭包放置在类定义的外部: ```javascript 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 ``` 这里,`_num`是一个共享的私有变量,因此`tom`和`jack`实例之间的`_num`值会互相影响。 #### 三、使用Symbol实现类的私有变量 `Symbol`类型是ES6新增的数据类型之一,用于创建唯一的标识符,常用来作为对象的属性名。 ##### **3.1 Symbol的基本用法** ```javascript const name = Symbol('名字'); const person = { [name]: 'www', say() { console.log(`name is ${this[name]}`); } }; person.say(); // 输出 "name is www" console.log(name); // 输出 Symbol(名字) ``` ##### **3.2 使用Symbol创建私有变量** 结合闭包和`Symbol`,可以实现更加灵活的私有变量管理: ```javascript const Person = (function() { const _num = Symbol('_num: 私有变量'); return class Person { constructor(name) { this.name = name; this[_num] = 100; } addNum() { return ++this[_num]; } getNum() { return this[_num]; } }; })(); const tom = new Person('Tom'); const jack = new Person('Jack'); console.log(tom.addNum()); // 输出 101 console.log(jack.getNum()); // 输出 100 ``` 在这个例子中,`_num`是一个私有的`Symbol`属性,每个实例都有自己的`_num`副本。 #### 四、通过WeakMap创建私有变量 `WeakMap`是一种特殊的映射类型,它的键必须是对象,且这些键是弱引用的,当对象不再被引用时会被自动回收。这使得`WeakMap`非常适合用于实现私有变量。 ##### **4.1 WeakMap基本用法** ```javascript const Parent = (function() { const privates = new WeakMap(); return class Parent { constructor() { const me = { data: "Private data goes here" }; privates.set(this, me); } getP() { const me = privates.get(this); return me.data; } }; })(); let p = new Parent(); console.log(p); // 输出 Parent {} console.log(p.getP()); // 输出 "Private data goes here" ``` #### 五、总结 - **闭包**方式简单直观,但可能会导致内存开销较大,尤其是在大量实例化的情况下。 - **Symbol**方式可以创建唯一的标识符,避免命名冲突,但在某些老版本浏览器中可能不被支持。 - **WeakMap**方式既节省内存又易于垃圾回收,而且兼容性较好,是最推荐的方法。 在实际开发中可以根据项目需求和个人喜好选择适合的方法来实现类的私有变量。


























- 粉丝: 1w+
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- Delphi计科教务管理.doc
- part-5(第5章)基于ARM的嵌入式系统硬件结构设计.ppt
- iPhone应用开发:从构思到营销的成功之道
- 基于 CNN 卷积神经网络的交通标志识别研究
- 西门子数控系统调试、编程与维修.doc
- 廊坊建立工业化和信息化融合的现代产业体系研究.docx
- IOS9000认证与我国企业质量管理分析研究(2010612).doc
- 计算机信息技术应用研究及风险防控.docx
- 第2章-项目管理环境.ppt
- 包含 PlotNeuralNet 绘制神经网络结构图的教程源代码
- 未成年人网络素养与网络保护.docx
- 基于一维数据的卷积神经网络模型解析
- 神经网络生成WordEmbedding
- 多处理器编程的艺术:并行世界的指南
- 基于神经网络的词嵌入(WordEmbedding)生成方法
- 基于 logistic 回归、SVM 与神经网络的分类算法实现


