详解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 相关文章推荐
超级兔子让浮动层消失的前因后果
Mar 09 Javascript
使用SyntaxHighlighter实现HTML高亮显示代码的方法
Feb 04 Javascript
js 上传图片预览问题
Dec 06 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
Jan 27 Javascript
PHP+mysql+Highcharts生成饼状图
May 04 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
Feb 08 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
Apr 20 Javascript
详解vue+vueRouter+webpack的简单实例
Jun 17 Javascript
JS实现元素上下左右移动效果
Oct 18 Javascript
angularjs数组判断是否含有某个元素的实例
Feb 27 Javascript
浅谈Node.js 中间件模式
Jun 12 Javascript
vue-element-admin 菜单标签失效的解决方式
Nov 12 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(2)
2006/10/09 PHP
php jsonp单引号转义
2014/11/23 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
Jquery iframe内部出滚动条
2010/02/11 Javascript
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
可以用来调试JavaScript错误的解决方案
2010/08/07 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
微信小程序实战之登录页面制作(5)
2020/03/30 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
基于Vue实现页面切换左右滑动效果
2020/06/29 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
Python之文字转图片方法
2018/05/10 Python
python实现机器学习之多元线性回归
2018/09/06 Python
python多线程扫描端口(线程池)
2019/09/04 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
python selenium自动化测试框架搭建的方法步骤
2020/06/14 Python
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
vue+django实现下载文件的示例
2021/03/24 Vue.js
法律专业实习鉴定
2013/12/22 职场文书
工作室成员个人发展规划范文
2014/01/24 职场文书
禁烟标语大全
2014/06/11 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
2014年检验科工作总结
2014/11/22 职场文书
考试后的感想
2015/08/07 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书
Python面向对象编程之类的概念
2021/11/01 Python
德劲DE1102数字调谐收音机机评
2022/04/07 无线电
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL