详解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 相关文章推荐
Javascript学习笔记二 之 变量
Dec 15 Javascript
php+js实现倒计时功能
Jun 02 Javascript
node.js中的fs.fstat方法使用说明
Dec 15 Javascript
javascript格式化json显示实例分析
Apr 21 Javascript
简单学习vue指令directive
Nov 03 Javascript
js return返回多个值,通过对象的属性访问方法
Feb 21 Javascript
微信小程序 scroll-view实现锚点滑动的示例
Dec 06 Javascript
vue定义全局变量和全局方法的方法示例
Aug 01 Javascript
详解angular2.x创建项目入门指令
Oct 11 Javascript
Node.js 中如何收集和解析命令行参数
Jan 08 Javascript
js实现弹框效果
Mar 24 Javascript
JavaScript中MutationObServer监听DOM元素详情
Nov 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
一个php作的文本留言本的例子(六)
2006/10/09 PHP
简体中文转换为繁体中文的PHP函数
2006/10/09 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
Prototype 工具函数 学习
2009/07/23 Javascript
Jquery 学习笔记(一)
2009/10/13 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
Angularjs 1.3 中的$parse实例代码
2017/09/14 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
微信小程序入口场景的问题集合与相关解决方法
2019/06/26 Javascript
解决layui调用自定义方法提示未定义的问题
2019/09/14 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
简单介绍Python中的try和finally和with方法
2015/05/05 Python
Python global全局变量函数详解
2018/09/18 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
2020/03/18 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
班级道德讲堂实施方案
2014/02/24 职场文书
村委会贫困证明范本
2014/09/17 职场文书
2014年文明创建工作总结
2014/11/25 职场文书
2014年教务处工作总结
2014/12/03 职场文书
教师工作表现评语
2014/12/31 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
JS数组的常用方法整理
2021/03/31 Javascript