javascript 静态对象和构造函数的使用和公私问题


Posted in Javascript onMarch 02, 2010

先看:

var objJson={ 
op1:'objJson option1', 

fn1:function(){ 


alert(this.op1) 

} 
}

在这种形式的声明下,你可以通过objJson.op1或者objJson.fn1()来直接访问内部的属性,这没有问题。但是如果是这样:
var objFn=function(){ 
this.op1='objFn.op1'; 

 this.op2=function(){ 


alert(this.op1) 

}; 
}

那么如果你直接objFn.op1或者objFn.op2()来访问内部的属性的话,就不行了,因为这个时候他还不是个对象。
所以我们需要将他实例化
var inst=new objFn(); 
alert(inst.op1); 
inst.op2();

这样就可以得到你想要的值了。
如果你想复制JSON形式的对象,很简单,但是有一个问题:
var newone=objJson; 
newone.op1='changed'; 
alert('objJson.op1');

你会发现原来的对象中的op1的值也发生了改变。但是如果使用的第二种的对象声明的办法,那么修改只是在实例的内部,不会影响其他的实例。
所以像JSON这样的静态对象适合在写一些常用的库的时候使用,有他自己的命名空间,谁也不会干扰到谁,而且方便使用。
构造函数的"公有""私有"属性
我们将上面的构造函数做一个修改:
var objFn=function(){ 
var pri1='私有变量'; 

this.op1='公共变量'; 

this.op2=function(){ 


alert(pri1+','+this.op1); 

}; 
}; 
var o=new objFn(); 
alert(typeof o.pri1+','+typeof o.op1);//undefined,string 
o.op2();//私有变量,公共变量

私有变量在对象外是不允许访问的,所有typeof以后是undefined。下面我们看看私有方法的访问:
var objFn=function(){ 
var pri1='私有变量'; 
var pri2=function(){ 
this.op2(); 
}; 
this.op1='公共变量'; 

this.op2=function(){ 


alert(pri1+','+this.op1); 

}; 

 this.acPri=function(){ 


pri2.call(this); 

}; 
}; 
var o=new objFn(); 
o.acPri();//私有变量,公共变量

注意到这里因为JavaScript的闭包特性,我们通过公有方法acPri()调用私有方法pri2的时候需要使用call将程序的上下文传递进去,不过就是这个看起来绕来绕去的太晕,可以稍稍的包装一下:
var objFn=function(){ 
var my=this; 
var pri1='私有变量'; 
var pri2=function(){ 
my.op2(); 
}; 
this.op1='公共变量'; 

 this.op2=function(){ 


alert(pri1+','+this.op1); 

}; 

 this.acPri=function(){ 


pri2.(); 

}; 
}; 
var o=new objFn(); 
o.acPri();//私有变量,公共变量

当然最后的结果还是不变。
转载请保留以下信息
作者:北玉(tw:@rehawk)
Javascript 相关文章推荐
JQuery 图片延迟加载并等比缩放插件
Nov 09 Javascript
jquery一般方法介绍 入门参考
Jun 21 Javascript
js bind 函数 使用闭包保存执行上下文
Dec 26 Javascript
JS实现控制表格只显示行边框或者只显示列边框的方法
Mar 31 Javascript
浅谈JavaScript中的字符编码转换问题
Jul 07 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
Jan 29 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
Sep 27 Javascript
Vue.js常用指令汇总(v-if、v-for等)
Nov 03 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
Sep 18 Javascript
js中Array对象的常用遍历方法详解
Jan 17 Javascript
纯js实现无缝滚动功能代码实例
Feb 21 Javascript
原生JS实现多条件筛选
Aug 19 Javascript
新老版本juqery获取radio对象的方法
Mar 01 #Javascript
几个比较经典常用的jQuery小技巧
Mar 01 #Javascript
基于JQuery的密码强度验证代码
Mar 01 #Javascript
Jquery下的26个实用小技巧(jQuery tips, tricks & solutions)
Mar 01 #Javascript
基于jquery.Jcrop的头像编辑器
Mar 01 #Javascript
IE event.srcElement和FF event.target 功能比较
Mar 01 #Javascript
Javascript 判断客户端浏览器类型代码
Mar 01 #Javascript
You might like
在Zeus Web Server中安装PHP语言支持
2006/10/09 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
smarty模板引擎从配置文件中获取数据的方法
2015/01/22 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/25 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
Node.js学习入门
2017/01/03 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
vue-cli初始化项目中使用less的方法
2018/08/09 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
python生成指定长度的随机数密码
2014/01/23 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
使用sklearn的cross_val_score进行交叉验证实例
2020/02/28 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
校园学雷锋活动月总结
2014/03/09 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
行政主管岗位职责
2015/02/03 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书