详解ES6实现类的私有变量的几种写法


Posted in Javascript onFebruary 10, 2021

闭包实现类的私有变量方式

私有变量不共享

通过 new 关键字 person 的构造函数内部的 this 将会指向 Tom,开辟新空间,再次全部执行一遍,

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

私有变量可共享

为避免每个实力都生成了一个新的私有变量,造成是有变量不可共享的问题,我们可以将这个私有变量放在类的构造函数到外面,继续通过闭包来返回这个变量。

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 简介:

创建一个独一无二的值,所有 Symbol 两两都不相等,创建时可以为其添加描述Symble("desc"),目前对象的健也支持 Symbol 了。

const name = Symbol('名字')
const person = { // 类名
  [name]:'www',
  say(){
    console.log(`name is ${this[name]} `) 
  } 
} 
person.say()
console.log(name)

使用Symbol为对象创建的健无法迭代和Json序列化,所以其最主要的作用就是为对象添加一个独一无二的值。
但可以使用getOwnProporitySymbols()获取Symbol.
缺点:新语法浏览器兼容不是很广泛。

symbol 实现类的私有变量

推荐使用闭包的方式创建 Symbol 的的引用,这样就可以在类的方法区获得此引用,避免方法都写在构造函数,每次创建新实例都要重新开辟空间赋值方法,造成内存浪费。

const Person = (function () {
 let _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

通过 weakmap 创建私有变量

MDN 简介

详解ES6实现类的私有变量的几种写法

实现:

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
  }
 } 
})()

let p = new Parent()
console.log(p)
console.log(p.getP())

总结

综上 weakmap 的方式来实现类似私有变量省内存,易回收,又能够被更多的浏览器兼容,也是最推荐的实现方法。

到此这篇关于详解ES6实现类的私有变量的几种写法的文章就介绍到这了,更多相关ES6 类的私有变量内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Document 对象的常用方法
Jul 31 Javascript
给应用部分的js代码设定一个统一的入口
Jun 15 Javascript
jQuery中click事件的定义和用法
Dec 20 Javascript
jquery实现图片随机排列的方法
May 04 Javascript
JavaScript函数的调用以及参数传递
Oct 21 Javascript
jQuery插件 Jqplot图表实例
Jun 18 Javascript
js中使用使用原型(prototype)定义方法的好处详解
Jul 04 Javascript
AngularJs Injecting Services Into Controllers详解
Sep 02 Javascript
浅谈Javascript事件对象
Feb 05 Javascript
简单了解小程序+node梳理登陆流程
Jun 24 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
Jul 28 Javascript
js实现批量删除功能
Aug 27 Javascript
微信小程序实现点赞业务
Feb 10 #Javascript
JS获取一个字符串中指定字符串第n次出现的位置
Feb 10 #Javascript
JavaScript canvas实现跟随鼠标移动小球
Feb 09 #Javascript
javascript实现简单留言板案例
Feb 09 #Javascript
javascript实现下拉菜单效果
Feb 09 #Javascript
用javascript实现倒计时效果
Feb 09 #Javascript
javascript实现倒计时关闭广告
Feb 09 #Javascript
You might like
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
php显示页码分页类的封装
2017/06/08 PHP
浅谈php使用curl模拟多线程发送请求
2019/03/08 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
JavaScript 字符串连接性能优化
2008/12/20 Javascript
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
2016/01/05 Javascript
Angular.js回顾ng-app和ng-model使用技巧
2016/04/26 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
jQuery实现表格奇偶行显示不同背景色 就这么简单
2017/03/13 Javascript
vue 计时器组件的实现代码
2017/09/14 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
基于tensorflow加载部分层的方法
2018/07/26 Python
Python_查看sqlite3表结构,查询语句的示例代码
2019/07/17 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
matplotlib基础绘图命令之errorbar的使用
2020/08/13 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
recorder.js 基于Html5录音功能的实现
2020/05/26 HTML / CSS
大学军训感言400字
2014/03/11 职场文书
出国英文推荐信
2014/05/10 职场文书
12岁生日演讲稿
2014/05/14 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
财务检查整改报告
2014/11/06 职场文书
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server
使用HBuilder制作一个简单的HTML5网页
2022/07/07 HTML / CSS