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 相关文章推荐
javascript解析json数据的3种方式
May 08 Javascript
JS在可编辑的div中的光标位置插入内容的方法
Nov 20 Javascript
分享9点个人认为比较重要的javascript 编程技巧
Apr 27 Javascript
基于jquery实现人物头像跟随鼠标转动
Aug 23 Javascript
url传递的参数值中包含&时,url自动截断问题的解决方法
Aug 02 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
Jul 20 jQuery
js处理包含中文的字符串实例
Oct 11 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
Mar 14 Javascript
Vue开发之watch监听数组、对象、变量操作分析
Apr 25 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
Mar 03 Javascript
JavaScript快速调试的两个技巧
Nov 04 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
Nov 13 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中call_user_func_array()函数的用法演示
2012/02/05 PHP
改写函数实现PHP二维/三维数组转字符串
2013/09/13 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
类似CSDN图片切换效果脚本
2009/09/17 Javascript
jQuery 工具函数学习资料
2010/04/29 Javascript
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
详解jQuery选择器
2016/12/21 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
JavaScript实现星级评价效果
2019/05/17 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
[02:51]2018年度DOTA2最佳中单位选手-完美盛典
2018/12/17 DOTA
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
python中stdout输出不缓存的设置方法
2014/05/29 Python
python生成日历实例解析
2014/08/21 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
朴素贝叶斯Python实例及解析
2018/11/19 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
Python 高效编程技巧分享
2020/09/10 Python
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
会计专业应届生自荐信
2014/02/07 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
区域经理岗位职责
2015/02/02 职场文书
实习证明格式范文
2015/06/16 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏