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 AJAX实现目录浏览与编辑的代码
Oct 21 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
Jun 28 Javascript
百度判断手机终端并自动跳转js代码及使用实例
Jun 11 Javascript
一个简单的全屏图片上下打开显示网页效果示例
Jul 08 Javascript
常用javascript表单验证汇总
Jul 20 Javascript
浅谈jquery中使用canvas的问题
Oct 10 Javascript
Angular2开发——组件规划篇
Mar 28 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
Sep 10 Javascript
浅谈微信小程序flex布局基础
Sep 10 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
Sep 26 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
Aug 14 Javascript
js正则表达式简单校验方法
Jan 03 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配置参数总结
2013/06/14 PHP
php防止网站被刷新的方法汇总
2014/12/01 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
PDO::setAttribute讲解
2019/01/29 PHP
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
document.documentElement的一些使用技巧
2013/04/18 Javascript
jQuery之过滤元素操作小结
2013/11/30 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
微信小程序收藏功能的实现代码
2018/06/12 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
jupyter安装小结
2016/03/13 Python
python语言中with as的用法使用详解
2018/02/23 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
使用python+whoosh实现全文检索
2019/12/09 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
给校长的建议书200字
2014/05/16 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
2015年学校远程教育工作总结
2015/07/20 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript
详解nginx location指令
2022/01/18 Servers
MySQL中order by的执行过程
2022/06/05 MySQL