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 相关文章推荐
在Windows上安装Node.js模块的方法
Sep 25 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
Apr 25 Javascript
JS简单实现元素复制示例附图
Nov 19 Javascript
javascript弹性运动效果简单实现方法
Jan 08 Javascript
javascript实现文字无缝滚动效果
Aug 26 Javascript
javaScript字符串工具类StringUtils详解
Dec 08 Javascript
JS中常用的消息框总结
Feb 24 Javascript
使用vue-router为每个路由配置各自的title
Jul 30 Javascript
使用JS代码实现俄罗斯方块游戏
Aug 03 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
Dec 13 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
Dec 18 Javascript
vue-cli3+typescript初体验小结
Feb 28 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
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
推荐文章系统(一)
2006/10/09 PHP
php&java(二)
2006/10/09 PHP
php预定义变量使用帮助(带实例)
2013/10/30 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
基于jquery的鼠标拖动效果代码
2012/05/30 Javascript
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
浅析jquery与checkbox的checked属性的问题
2016/04/27 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
Vuex提升学习篇
2018/01/11 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
基于webpack.config.js 参数详解
2018/03/20 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
python处理cookie详解
2014/02/07 Python
Python 实现简单的电话本功能
2015/08/09 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
python 搜索大文件的实例代码
2019/07/08 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
Django中提示消息messages的设置方式
2019/11/15 Python
如何表示python中的相对路径
2020/07/08 Python
计算机专业职业生涯规划范文
2014/01/19 职场文书
蛋糕店的商业计划书范文
2014/01/27 职场文书
2014年情人节活动方案
2014/02/16 职场文书
小学生安全演讲稿
2014/04/25 职场文书
车辆工程专业求职信
2014/04/28 职场文书
高中班长竞选稿
2015/11/20 职场文书
Python 可迭代对象 iterable的具体使用
2021/08/07 Python
了解MySQL查询语句执行过程(5大组件)
2022/08/14 MySQL