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 相关文章推荐
Js 导出table内容到Excel的简单实例
Nov 19 Javascript
div失去焦点事件实现思路
Apr 22 Javascript
js 动态为textbox添加下拉框数据源的方法
Apr 24 Javascript
使用时间戳解决ie缓存的问题
Aug 20 Javascript
JavaScript动态添加css样式和script标签
Jul 19 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
Feb 12 Javascript
对angular 实时更新模板视图的方法$apply详解
Oct 09 Javascript
js实现京东秒杀倒计时功能
Jan 21 Javascript
使用react context 实现vue插槽slot功能
Jul 18 Javascript
JS实现的tab切换并显示相应内容模块功能示例
Aug 03 Javascript
js实现视图和数据双向绑定的方法分析
Feb 05 Javascript
微信小程序实现滚动Tab选项卡
Nov 16 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版
2012/04/20 PHP
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
2012/07/16 PHP
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
php实现QQ空间获取当前用户的用户名并生成图片
2015/07/25 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
jQuery 动态酷效果实现总结
2009/12/27 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
浅谈JS的基础类型与引用类型
2016/09/13 Javascript
那些精彩的JavaScript代码片段
2017/01/12 Javascript
vue.js学习笔记:如何加载本地json文件
2017/01/17 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
Vue组件库发布到npm详解
2018/02/17 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
python人人网登录应用实例
2014/09/26 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
Python flask框架端口失效解决方案
2020/06/04 Python
浅析Python面向对象编程
2020/07/10 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
幼儿园实习自我鉴定
2013/12/15 职场文书
汽车维修专业个人求职信范文
2014/01/01 职场文书
大学生村官典型材料
2014/01/12 职场文书
户籍证明模板
2014/09/28 职场文书
投诉信格式范文
2015/07/02 职场文书
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server
CSS font-variation 可变字体的魅力(实例详解)
2022/03/03 HTML / CSS
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫