javaScript 利用闭包模拟对象的私有属性


Posted in Javascript onDecember 29, 2011

JavaScript缺少块级作用域,没有private修饰符,但它具有函数作用域。作用域的好处是内部函数可以访问它们的外部函数的参数和变量(除了this和argument。内部中的函数中的this指向全局对象,argument指向内部函数的函数参数)。我们可以利用这种属性来模拟面向对象中的私有属性。

var myObject=function(value){ 
var value=value || 0; 
return{ 
increment:function(num){ 
value+=typeof num==='number' ? num : 0; 
}, 
setValue:function(num){ 
value = typeof num==='number' ? num : value; 
}, 
getValue:function(){ 
return value; 
} 
} 
}(10) 
//alert(myObject.getValue()); //10 
myObject.setValue(20); 
//alert(myObject.getValue()); //20 
myObject.increment(5); 
alert(myObject.getValue()); //25

如上例中,myObjeact是匿名函数执行后返回的对象。匿名函数中变量value对于匿名函数外部来说是不可访问的,但对于其内部的函数,是可以访问的,匿名函数执行结束,由于变量value仍被返回的myObject对象所存取,故value所占据的内存并没有被销毁。此时,内部的变量value就如同myObject对象的私有变量一样。
var myObject=function(value){ 
var name='MyObject'; 
return{ 
increment:function(num){ 
value+=typeof num==='number' ? num : 0; 
}, 
setValue:function(num){ 
value = typeof num==='number' ? num : value; 
}, 
getValue:function(){ 
//alert(this); 
return value; 
}, 
getName:function(){ 
return name; 
}, 
setName:function(nameStr){ 
name=nameStr; 
}, 
toString:function(){ 
return '[Object:'+name+']'; 
} 
} 
} 
var obj=myObject(5); 
obj.increment(6); 
//alert(obj.getValue()); // 11 
//alert(obj); //[Object:MyObject] 
obj.setName('temp object 01'); 
alert(obj) //[Object:temp object 01]
Javascript 相关文章推荐
escape函数解决js中ajax传递中文出现乱码问题
Oct 30 Javascript
jQuery中prev()方法用法实例
Jan 08 Javascript
javascript实现网页端解压并查看zip文件
Dec 15 Javascript
浅谈javascript中的三种弹窗
Oct 21 Javascript
js 博客内容进度插件详解
Feb 19 Javascript
js定时器+简单的动画效果实例
Nov 10 Javascript
vue-cli实现多页面多路由的示例代码
Jan 30 Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
May 08 Javascript
解决在Vue中使用axios用form表单出现的问题
Oct 30 Javascript
ES6中Promise的使用方法实例总结
Feb 18 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
Mar 12 Javascript
浅谈vue.watch的触发条件是什么
Nov 07 Javascript
Jquery中删除元素的实现代码
Dec 29 #Javascript
js的表单操作 简单计算器
Dec 29 #Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
Dec 29 #Javascript
JavaScript中两个感叹号的作用说明
Dec 28 #Javascript
javascript (用setTimeout而非setInterval)
Dec 28 #Javascript
js字符编码函数区别分析
Dec 28 #Javascript
javascript获得服务器端控件的ID的实现代码
Dec 28 #Javascript
You might like
php include加载文件两种方式效率比较
2010/08/08 PHP
php去除重复字的实现代码
2011/09/16 PHP
PHP新手NOTICE错误常见解决方法
2011/12/07 PHP
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
PHP+MySQL之Insert Into数据插入用法分析
2015/09/27 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
2017/04/21 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
Vue解析带html标签的字符串为dom的实例
2019/11/13 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
python去掉 unicode 字符串前面的u方法
2018/10/21 Python
python实现多进程代码示例
2018/10/31 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
python虚拟环境迁移方法
2019/01/03 Python
200行python代码实现2048游戏
2019/07/17 Python
python构建指数平滑预测模型示例
2019/11/21 Python
django创建css文件夹的具体方法
2020/07/31 Python
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
家电业务员岗位职责
2014/03/10 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
大二学年个人总结
2015/03/03 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android