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 相关文章推荐
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
Feb 18 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
Feb 19 Javascript
容易造成JavaScript内存泄露几个方面
Sep 04 Javascript
一个JavaScript操作元素定位元素的实例
Oct 29 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
Dec 10 Javascript
关于json字符串与实体之间的严格验证代码
Nov 10 Javascript
详解ES6中的let命令
Apr 05 Javascript
js Canvas实现的日历时钟案例分享
Dec 25 Javascript
详解在 Angular 项目中添加 clean-blog 模板
Jul 04 Javascript
vue.js element-ui validate中代码不执行问题解决方法
Dec 18 Javascript
JS插件clipboard.js实现一键复制粘贴功能
Dec 04 Javascript
js实现ATM机存取款功能
Oct 27 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中for循环语句的几种变型
2006/11/26 PHP
php Static关键字实用方法
2010/06/04 PHP
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
php下获取http状态的实现代码
2014/05/09 PHP
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
2008/09/27 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
jQuery的cookie插件实现保存用户登陆信息
2014/04/15 Javascript
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
利用Node.js制作爬取大众点评的爬虫
2016/09/22 Javascript
localStorage的黑科技-js和css缓存机制
2017/02/06 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
关于vue面试题汇总
2018/03/20 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
js实现简易ATM功能
2020/10/27 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
padas 生成excel 增加sheet表的实例
2018/12/11 Python
Python设计模式之解释器模式原理与用法实例分析
2019/01/10 Python
Django静态文件加载失败解决方案
2020/08/26 Python
澳大利亚便宜隐形眼镜购买网站:QUICKLENS Australia
2018/10/06 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
会计找工作求职信范文
2013/12/09 职场文书
生物技术专业毕业生求职信范文
2013/12/14 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
社区党建工作汇报材料
2014/10/27 职场文书
党的群众路线教育实践活动学习笔记范文
2014/11/06 职场文书
高中班主任评语
2014/12/30 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
小学秋季运动会加油口号及加油稿
2019/08/19 职场文书
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL
攻击最高的10只幽灵系神奇宝贝,坚盾剑怪排第一,第五最为可怕
2022/03/18 日漫