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 相关文章推荐
一个关于jqGrid使用的小例子(行按钮)
Nov 04 Javascript
用JQUERY增删元素的代码
Feb 14 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
Jan 11 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
Aug 02 Javascript
浅谈javascript中call()、apply()、bind()的用法
Apr 20 Javascript
js实现select选择框效果及美化
Aug 19 Javascript
AngularJs 动态加载模块和依赖
Sep 15 Javascript
在js中做数字字符串补0(js补零)
Mar 25 Javascript
深入理解Angular.JS中的Scope继承
Jun 04 Javascript
vue-cli单页应用改成多页应用配置详解
Jul 14 Javascript
浅谈React前后端同构防止重复渲染
Jan 05 Javascript
如何解决.vue文件url引用文件的问题
Jan 18 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
php实现建立多层级目录的方法
2014/07/19 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
php中的异常和错误浅析
2017/05/03 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
js实现文字在按钮上滚动的方法
2015/08/20 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
JS使用setInterval实现的简单计时器功能示例
2018/04/19 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
Vue使用Proxy监听所有接口状态的方法实现
2019/06/07 Javascript
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
Python编程中的反模式实例分析
2014/12/08 Python
21行Python代码实现拼写检查器
2016/01/25 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
Python3爬虫里关于Splash负载均衡配置详解
2020/07/10 Python
国际奢侈品品牌童装购物网站:Designer Childrenswear
2019/05/08 全球购物
Linux如何压缩可执行文件
2014/03/27 面试题
Python如何实现单例模式
2016/06/03 面试题
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
会计专业毕业生自荐信范文
2013/12/20 职场文书
项目计划书范文
2014/01/09 职场文书
2014年清明节寄语
2014/04/03 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
优质服务演讲稿
2014/05/14 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
一年级语文下册复习计划
2015/01/17 职场文书