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 相关文章推荐
tagName的使用,留一笔
Jun 26 Javascript
jquery实现图片灯箱明暗的遮罩效果
Nov 15 Javascript
jquery form 加载数据示例
Apr 21 Javascript
jquery简单的弹出层浮动层代码
Apr 27 Javascript
jquery表单对象属性过滤选择器实例分析
May 18 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
Feb 14 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
Aug 31 Javascript
详解vue 组件之间使用eventbus传值
Oct 25 Javascript
Vue批量图片显示时遇到的路径被解析问题
Mar 28 Javascript
vue实现文件上传读取及下载功能
Nov 17 Javascript
使用webpack搭建vue环境的教程详解
Dec 31 Javascript
JavaScript实现alert弹框效果
Nov 19 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
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
PDO::errorCode讲解
2019/01/28 PHP
PHP观察者模式定义与用法实例分析
2019/03/22 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
js向上无缝滚动,网站公告效果 具体代码
2013/11/18 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
实例讲解JavaScript中instanceof运算符的用法
2016/06/08 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
[01:03:51]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第三场
2018/04/09 DOTA
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
Python中GIL的使用详解
2018/10/03 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
python 图像增强算法实现详解
2021/01/24 Python
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
环境工程求职简历的自我评价范文
2013/10/24 职场文书
四年级语文教学反思
2014/02/05 职场文书
党课主持词大全
2015/06/30 职场文书
校运会通讯稿
2015/07/18 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
创业计划书之溜冰场
2019/10/25 职场文书