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 相关文章推荐
永不消失的title提示代码
Feb 15 Javascript
jquery绑定原理 简单解析与实现代码分享
Sep 06 Javascript
javaScript 利用闭包模拟对象的私有属性
Dec 29 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
Sep 11 Javascript
jquery iframe操作详细解析
Nov 20 Javascript
jquery 取子节点及当前节点属性值的方法
Aug 24 Javascript
jQuery Ajax使用实例
Apr 16 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
Jan 10 Javascript
详解Chart.js轻量级图表库的使用经验
May 22 Javascript
vue-cli3+typescript初体验小结
Feb 28 Javascript
webpack4之如何编写loader的方法步骤
Jun 06 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
Oct 17 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
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
用cookies来跟踪识别用户
2006/10/09 PHP
介绍php设计模式中的工厂模式
2008/06/12 PHP
php实现图片添加水印功能
2014/02/13 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
简单谈谈JavaScript的同步与异步
2015/12/31 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
浅谈Node 调试工具入门教程
2018/03/20 Javascript
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
python中的__slots__使用示例
2015/02/26 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
使用python实现飞机大战游戏
2020/03/23 Python
Django怎么在admin后台注册数据库表
2020/11/14 Python
软件测试工程师笔试题带答案
2015/03/27 面试题
Delphi软件工程师试题
2013/01/29 面试题
英文版银行求职信
2013/10/09 职场文书
应届毕业生求职信范例分享
2013/12/17 职场文书
外企办公室竞聘演讲稿
2013/12/29 职场文书
关于圣诞节的广播稿
2014/01/26 职场文书
DIY手工制作经营店创业计划书
2014/02/01 职场文书
公司合作意向书范文
2014/07/30 职场文书
高中生旷课检讨书
2014/10/08 职场文书
党员个人党性分析材料
2014/12/18 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers