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 相关文章推荐
jQuery 第二课 操作包装集元素代码
Mar 14 Javascript
初窥JQuery-Jquery简介 入门了解篇
Nov 25 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
Nov 22 Javascript
一个不错的仿携程自定义数据下拉选择select
Sep 01 Javascript
使用javascript提交form表单方法汇总
Jun 25 Javascript
深入理解JavaScript中的对象复制(Object Clone)
May 18 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
Aug 05 Javascript
详解angular element()方法使用
Apr 08 Javascript
vue cli webpack中使用sass的方法
Feb 24 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
May 16 Javascript
微信小程序上传文件到阿里OSS教程
May 20 Javascript
Javascript组合继承方法代码实例解析
Apr 02 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
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
php生成mysql的数据字典
2016/07/07 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
vue 实现全选全不选的示例代码
2018/03/29 Javascript
基于vue cli 通过命令行传参实现多环境配置
2018/07/12 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
python网络编程示例(客户端与服务端)
2014/04/24 Python
Python输出带颜色的字符串实例
2017/10/10 Python
Python3.7 dataclass使用指南小结
2019/02/22 Python
Python中的引用知识点总结
2019/05/20 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
祖国在我心中演讲稿300字
2014/05/04 职场文书
新闻学专业求职信
2014/07/28 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android