如何在JavaScript中声明私有变量

  介绍

本篇文章为大家展示了如何在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中声明私有变量