介绍前言
闭包
WeakMap
本篇文章为大家展示了如何在JavaScript中声明私有变量,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
前言
JavaScript并不像别的语言,能使用关键字来声明私有变量。
我了解的JavaScript能用来声明私有变量的方式有两种,一种是使用闭包,一种是使用WeakMap。
闭包
闭包的描述有很多种,比如:
能访问其它函数作用域的函数;
内部函数访问外部函数作用域的桥梁;
,
使用闭包构建私有变量的逻辑在于:
1。在外部函数中声明变量和内部函数;
2。使用内部函数访问或者修改变量值;
3。在外部函数内返回内部函数;
function 外(){ let val =, 123; function 在(){ return val; } return 内部; } console.log(外()());//123
通过我上面的例子能够大致了解使用闭包构建私有变量的逻辑,但是不足以体现私有变量的重要性,一个const变量也能达到上述代码的效果:
//同样的能访问,但是不能修改,达到了上述代码的效果 const val =, 123; console.log (val);//123
接下来的代码,将具体体现私有变量的重要性:
function 人(){, ,let _name =, & # 39;未知# 39;; ,let _age =, 18; ,let _sex =, & # 39;男人# 39;; ,function setName(名字){ _name 才能=,name | |, & # 39;未知# 39;; ,} ,function getName () { return 才能;_name; ,} ,function setAge(年龄){ 如果才能(typeof age ===, & # 39;数字# 39;){ ,,_age =, Math.floor(年龄); }{其他才能 ,,throw 错误(“typeof  age !==, & # 39;数字# 39;“); ,,} ,} ,function getAge () { return 才能;_age; ,} ,function setSex(性){ 如果才能(sex ===, & # 39;男人# 39;,| |,sex ===, 1) { ,,_sex =, & # 39;男人# 39;; }才能else 如果(sex ===, & # 39;女人# 39;,| |,sex ===, 0) { ,,_sex =, & # 39;女人# 39;; }{其他才能 ,,throw 错误(& # 39;input 错误# 39;); ,,} ,} ,function getSex () { return 才能;_sex; ,} ,return { setName 才能:setName, getName 才能:getName, setAge 才能:setAge, getAge 才能:getAge, setSex 才能:setSex, getSex 才能:getSex ,} } let xiaoming =,人(); let xiaohong =,人(); xiaoming.setName(& # 39;小明# 39;); xiaohong.setName(& # 39;北京市# 39;); console.log (& # 39; xiaoming name :, & # 39;, +, xiaoming.getName ());//xiaoming name :小明 console.log (& # 39; xiaohong name :, & # 39;, +, xiaohong.getName ());//xiaohong name :北京市 xiaoming.setAge (19.3333); xiaohong.setAge (& # 39; 16 & # 39;);//Uncaught 错误:,typeof age !==, & # 39;数字# 39; console.log (& # 39; xiaoming age :, & # 39;, +, xiaoming.getAge ());//xiaoming age : 19 console.log (& # 39; xiaohong age :, & # 39;, +, xiaohong.getAge ());//xiaohong age : 18 xiaoming.setSex (1); xiaohong.setSex(& # 39;女人# 39;); console.log (& # 39; xiaoming sex :, & # 39;, +, xiaoming.getSex ());//xiaoming sex :男人 console.log (& # 39; xiaohong sex :, & # 39;, +, xiaohong.getSex ());//xiaohong sex :,女人
从上面的代码中,可以看的出,如果想要设置或者获取_name, _age, _sex三个变量的值,只能通过固定的setName, getName, setAge, getAge, setSex, getSex等方法,而在所有的setter方法中,都对形参进行了判断。也就意味着,对对象的所有操作都将在掌控之中,这在某一层面上弱化了JavaScript作为弱类型语言上的一些负面影响。
WeakMap
如果对WeakMap不是很了解的可以先看WeakMap的详细介绍。
这里主要是利用WeakMap的关键不可枚举这一知识点。
let nameWeakMap =, new WeakMap (); let ageWeakMap =, new WeakMap (); let sexWeakMap =, new WeakMap (); function 人(){ ,let _hash =, Object.create(空); ,nameWeakMap.set (_hash & # 39;未知# 39;); ,ageWeakMap.set (_hash, 18); ,sexWeakMap.set (_hash & # 39;男人# 39;); ,function setName(名字){ nameWeakMap.set才能(_hash name | |, & # 39;未知# 39;); ,} ,function getName () { return 才能nameWeakMap.get (_hash); ,} ,function setAge(年龄){ 如果才能(typeof age ===, & # 39;数字# 39;){ ,,ageWeakMap.set (_hash Math.floor(年龄)); }{其他才能 ,,throw 错误(“typeof  age !==, & # 39;数字# 39;“); ,,} ,} ,function getAge () { return 才能ageWeakMap.get (_hash); ,} ,function setSex(性){ 如果才能(sex ===, & # 39;男人# 39;,| |,sex ===, 1) { ,,sexWeakMap.set (_hash & # 39;男人# 39;); }才能else 如果(sex ===, & # 39;女人# 39;,| |,sex ===, 0) { ,,sexWeakMap.set (_hash & # 39;女人# 39;); }{其他才能 ,,throw 错误(& # 39;input 错误# 39;); ,,} ,} ,function getSex () { return 才能sexWeakMap.get (_hash); ,} null null null null null null null null null null null null null null null null null null null null null null null null null null null如何在JavaScript中声明私有变量