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(jquery)利用函数修改全局变量的代码
Nov 02 Javascript
javascript 多种搜索引擎集成的页面实现代码
Jan 02 Javascript
js输入框邮箱自动提示功能代码实现
Dec 10 Javascript
php结合imgareaselect实现图片裁剪
Jul 05 Javascript
针对初学者的jQuery入门指南
Aug 15 Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
Jan 10 Javascript
js数字舍入误差以及解决方法(必看篇)
Feb 28 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
Sep 28 Javascript
说说Vuex的getters属性的具体用法
Apr 15 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
May 10 Javascript
微信小程序实现页面左右滑动
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做的端口嗅探器--可以指定网站和端口
2006/10/09 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
jquery 弹出层实现代码
2009/10/30 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
2016/01/05 Javascript
js实现文字截断功能
2016/09/14 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
2018/09/17 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
python实现人脸签到系统
2020/04/13 Python
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
一些网络技术方面的面试题
2014/05/01 面试题
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
高三毕业典礼演讲稿
2014/05/13 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏