JS使用闭包保护变量,防止污染

<script type="text/javascript">
/**日志过滤的参数,将方法内的局部变量ParamMap隐藏,统一通过方法名获取内部数据的操作调用,避免混乱*/
paramMapObj=function(methodName){	 
	var ParamMap={};	//被保护的内部数据,外部无法直接访问,仅可通过内部函数访问 
	this.ParamMap=null;//禁止使用该属性,会不断清空该属性防止有人误用
	function getParamMap(paramId){
		var paramObj = ParamMap[paramId]
		//返回浅克隆对象,避免暴露内部对象,仅可通过修改方法修改数据
		//深克隆为JSON.parse(JSON.stringify(paramObj));暂时浅克隆已经够了
		return Object.assign({}, paramObj);
	}
	function setParamMap(paramId,paramObj){
		ParamMap[paramId]=paramObj;
	}	
	function getInnerFun(methodName){
		if (methodName) {
			//清空禁止使用的this.ParamMap属性,防止有人误用,正确使用方法为创建函数,然后在函数内访问ParamMap;
			this.ParamMap="不允许使用该属性,请通过内部函数方式操作.";
			switch (methodName) {
			case "getParamMap":
				return getParamMap;
			case "setParamMap":
				return setParamMap;
			default:
				return null;
			}
		} else {
			return null;
		}
	}
	
	return getInnerFun;
};
getParamMapFun=paramMapObj();
/** 日志过滤条件全局唯一的访问方法 */
function getParamMapFun(methodName){
	return getParamMapFun(methodName);
}
//获取历史日志的过滤条件
function getParamMap(paramId){
	var fun = getParamMapFun("getParamMap");
	return fun(paramId);
}
//设置历史日志的过滤条件
function setParamMap(paramId,paramObj){
	var fun = getParamMapFun("setParamMap");
	return fun(paramId,paramObj);
}


// 使用示例eg:

setParamMap(1,{id:1,name:'1  我,还是我~~~'});
alert("getParamMap(1)可以获取到数据"+getParamMap(1).name+"  外部直接获取不到"+paramMapObj.ParamMap);
var data = getParamMap(1);
data.name='2  是不一样的烟火~~~';
alert("getParamMap(1).name='2  是不一样的烟火~~~'");
alert("外部修改不了数据,name没变"+getParamMap(1).name);
</script>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值