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小技巧
Jul 21 Javascript
复制本贴标题和地址的js代码
Jul 01 Javascript
jquery中用jsonp实现搜索框功能
Oct 18 Javascript
JavaScript面向对象分层思维全面解析
Nov 22 Javascript
JavaScript实现翻页功能(附效果图)
Feb 16 Javascript
Bootstrap提示框效果的实例代码
Jul 12 Javascript
React-Native做一个文本输入框组件的实现代码
Aug 10 Javascript
Bootstrap Table 删除和批量删除
Sep 22 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
Nov 14 Javascript
jQuery实现高级检索功能
May 28 jQuery
layer设置maxWidth及maxHeight解决方案
Jul 26 Javascript
原生JS实现多条件筛选
Aug 19 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+dbfile开发小型留言本
2006/10/09 PHP
php中的strpos使用示例
2014/02/27 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
window.open的功能全解析
2006/10/10 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
常用DOM整理
2015/06/16 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
改变checkbox默认选中状态及取值的实现代码
2016/05/26 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
原生JavaScript实现AJAX、JSONP
2017/02/07 Javascript
JS排序之选择排序详解
2017/04/08 Javascript
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
2019/04/24 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
js数组的基本使用总结
2021/01/18 Javascript
vue-video-player 断点续播的实现
2021/02/01 Vue.js
Python实现股市信息下载的方法
2015/06/15 Python
Python三级目录展示的实现方法
2016/09/28 Python
python2.7到3.x迁移指南
2018/02/01 Python
Python获取时间戳代码实例
2019/09/24 Python
详解python 中in 的 用法
2019/12/12 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
澳洲的服装老品牌:SABA
2018/02/06 全球购物
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
纪律教育学习心得体会
2014/09/02 职场文书
史上最牛的辞职信
2015/02/28 职场文书