JavaScript 声明私有变量的两种方式
前言
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 声明私有变量的资料请关注其它相关文章!
上一篇: Bottle部署web服务及postman接口的方法
下一篇: 揭阳春游去哪里最好 揭阳春游好去处