JavaScript 声明私有变量的两种方式


Posted in Javascript onFebruary 05, 2021

前言

JavaScript并不像别的语言,能使用关键字来声明私有变量。
我了解的JavaScript能用来声明私有变量的方式有两种,一种是使用闭包,一种是使用WeakMap。

闭包

闭包的描述有很多种,比如:
能访问其它函数作用域的函数;
内部函数访问外部函数作用域的桥梁;
......

使用闭包构建私有变量的逻辑在于:
1.在外部函数中声明变量和内部函数;
2.使用内部函数访问或者修改变量值;
3.在外部函数内返回内部函数;

function outside(){
	let val = 123;
	function inside(){
		return val;
	}
	return inside;
}
console.log(outside()());//123

通过我上面的例子能够大致了解使用闭包构建私有变量的逻辑,但是不足以体现私有变量的重要性,一个const变量也能达到上述代码的效果:

//同样的能访问,但是不能修改,达到了上述代码的效果
const val = 123;
console.log(val);//123

接下来的代码,将具体体现私有变量的重要性:

function person(){ 
 let _name = 'unknown';
 let _age = 18;
 let _sex = 'man';

 function setName(name){
  _name = name || 'unknown';
 }

 function getName(){
  return _name;
 }

 function setAge(age){
  if(typeof age === 'number'){
   _age = Math.floor(age);
  }else{
   throw Error("typeof age !== 'number'");
  }
 }

 function getAge(){
  return _age;
 }

 function setSex(sex){
  if(sex === 'man' || sex === 1){
   _sex = 'man';
  }else if(sex === 'woman' || sex === 0){
   _sex = 'woman';
  }else{
   throw Error('input error');
  }
 }

 function getSex(){
  return _sex;
 }

 return {
  setName : setName,
  getName : getName,
  setAge : setAge,
  getAge : getAge,
  setSex : setSex,
  getSex : getSex
 }
}

let xiaoming = person();
let xiaohong = person();
xiaoming.setName('xiaoming');
xiaohong.setName('xiaohong');
console.log('xiaoming name : ' + xiaoming.getName());//xiaoming name : xiaoming
console.log('xiaohong name : ' + xiaohong.getName());//xiaohong name : xiaohong

xiaoming.setAge(19.3333);
xiaohong.setAge('16');//Uncaught Error: typeof age !== 'number'
console.log('xiaoming age : ' + xiaoming.getAge());//xiaoming age : 19
console.log('xiaohong age : ' + xiaohong.getAge());//xiaohong age : 18


xiaoming.setSex(1);
xiaohong.setSex('woman');
console.log('xiaoming sex : ' + xiaoming.getSex());//xiaoming sex : man
console.log('xiaohong sex : ' + xiaohong.getSex());//xiaohong sex : woman

从上面的代码中,可以看出,如果想要设置或者获取 _name、_age、_sex三个变量的值,只能通过固定的 setName、getName、setAge、getAge、setSex、getSex等方法,而在所有的setter方法中,都对形参进行了判断。也就意味着,对对象的所有操作都将在掌控之中,这在某一层面上弱化了JavaScript作为弱类型语言上的一些负面影响。

WeakMap

如果对WeakMap不是很了解的可以先看WeakMap的详细介绍。
这里主要是利用WeakMap的key不可枚举这一知识点。

let nameWeakMap = new WeakMap();
let ageWeakMap = new WeakMap();
let sexWeakMap = new WeakMap();

function person(){
 let _hash = Object.create(null);
 nameWeakMap.set(_hash,'unknown');
 ageWeakMap.set(_hash,18);
 sexWeakMap.set(_hash,'man');
 function setName(name){
  nameWeakMap.set(_hash,name || 'unknown');
 }

 function getName(){
  return nameWeakMap.get(_hash);
 }

 function setAge(age){
  if(typeof age === 'number'){
   ageWeakMap.set(_hash,Math.floor(age));
  }else{
   throw Error("typeof age !== 'number'");
  }
 }

 function getAge(){
  return ageWeakMap.get(_hash);
 }

 function setSex(sex){
  if(sex === 'man' || sex === 1){
   sexWeakMap.set(_hash,'man');
  }else if(sex === 'woman' || sex === 0){
   sexWeakMap.set(_hash,'woman');
  }else{
   throw Error('input error');
  }
 }

 function getSex(){
  return sexWeakMap.get(_hash);
 }

 return {
  setName : setName,
  getName : getName,
  setAge : setAge,
  getAge : getAge,
  setSex : setSex,
  getSex : getSex
 }
}

let xiaoming = person();
let xiaohong = person();
xiaoming.setName('xiaoming');
xiaohong.setName('xiaohong');
console.log('xiaoming name : ' + xiaoming.getName());//xiaoming name : xiaoming
console.log('xiaohong name : ' + xiaohong.getName());//xiaohong name : xiaohong

xiaoming.setAge(19.3333);
xiaohong.setAge('16');//Uncaught Error: typeof age !== 'number'
console.log('xiaoming age : ' + xiaoming.getAge());//xiaoming age : 19
console.log('xiaohong age : ' + xiaohong.getAge());//xiaohong age : 18


xiaoming.setSex(1);
xiaohong.setSex('woman');
console.log('xiaoming sex : ' + xiaoming.getSex());//xiaoming sex : man
console.log('xiaohong sex : ' + xiaohong.getSex());//xiaohong sex : woman

同样达成了构建私有变量的效果。顺便提一句,class中构建私有变量用的就是WeakMap。

结尾

这篇文章只是记录我知道的关于JavaScript构建私有变量的方法以及作用,如有错误和遗漏,欢迎指出,不胜感谢。

以上就是JavaScript 声明私有变量的两种方式的详细内容,更多关于JavaScript 声明私有变量的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JQuery1.6 使用方法三
Nov 23 Javascript
javascript学习笔记(十四) window对象使用介绍
Jun 20 Javascript
对 jQuery 中 data 方法的误解分析
Jun 18 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
Dec 16 Javascript
纯JavaScript代码实现文本比较工具
Feb 17 Javascript
js插件dropload上拉下滑加载数据实例解析
Jul 27 Javascript
第一次接触神奇的Bootstrap
Oct 14 Javascript
浅谈jquery中next与siblings的区别
Oct 27 Javascript
Bootstrap 轮播(Carousel)插件
Dec 26 Javascript
基于vue实现多引擎搜索及关键字提示
Mar 16 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
Sep 16 Javascript
详解各版本React路由的跳转的方法
May 10 Javascript
node.js文件的复制、创建文件夹等相关操作
Feb 05 #Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
Feb 05 #Javascript
JavaScript代码实现微博批量取消关注功能
Feb 05 #Javascript
js属性对象的hasOwnProperty方法的使用
Feb 05 #Javascript
关于element的表单组件整理笔记
Feb 05 #Javascript
详解JavaScript中的this指向问题
Feb 05 #Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
Feb 05 #Javascript
You might like
php生成xml简单实例代码
2009/12/16 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
jQuery使用post方法提交数据实例
2015/03/25 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
2018/12/06 NodeJs
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
Python 随机生成中文验证码的实例代码
2013/03/20 Python
pyqt和pyside开发图形化界面
2014/01/22 Python
Python读写配置文件的方法
2015/06/03 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
Python中按键来获取指定的值
2019/03/02 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
【python】matplotlib动态显示详解
2019/04/11 Python
python圣诞树编写实例详解
2020/02/13 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
瑞典耳机品牌:URBANISTA
2019/12/03 全球购物
高中英语教学反思
2014/02/04 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
施工安全汇报材料
2014/08/17 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
公诉意见书范文
2015/06/05 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
宣传稿格式范文
2015/07/23 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书