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.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
Jun 28 Javascript
JQuery中extend使用介绍
Mar 13 Javascript
jquery加载图片时以淡入方式显示的方法
Jan 14 Javascript
剖析Node.js异步编程中的回调与代码设计模式
Feb 16 Javascript
JS获取复选框的值,并传递到后台的实现方法
May 30 Javascript
浅谈Javascript中的Label语句
Dec 14 Javascript
微信小程序 图片宽高自适应详解
May 11 Javascript
vue 文件目录结构详解
Nov 24 Javascript
深入浅析Vue全局组件与局部组件的区别
Jun 15 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
Nov 28 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
Dec 13 Javascript
轻松解决JavaScript定时器越走越快的问题
May 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 网上商城促销设计实例代码
2012/02/17 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
php中的动态调用实例分析
2015/01/07 PHP
yii2 页面底部加载css和js的技巧
2016/04/21 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
2017/04/04 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
Javascript中的String对象详谈
2014/03/03 Javascript
$("").click与onclick的区别示例介绍
2014/09/25 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
jQuery中将json数据显示到页面表格的方法
2018/05/27 jQuery
JavaScript面向对象程序设计创建对象的方法分析
2018/08/13 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
Python中Threading用法详解
2017/12/27 Python
python抓取文件夹的所有文件
2018/02/27 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
Python企业编码生成系统总体系统设计概述
2019/07/26 Python
详解python中__name__的意义以及作用
2019/08/07 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
python如何使用代码运行助手
2020/07/03 Python
django rest framework 过滤时间操作
2020/07/12 Python
Python从文件中读取数据的方法步骤
2020/11/18 Python
python3判断IP地址的方法
2021/03/04 Python
互联网创业计划书写作技巧攻略
2014/03/23 职场文书
个人自我鉴定总结
2014/03/25 职场文书
2014年监理个人工作总结
2014/12/11 职场文书