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 相关文章推荐
潜说js对象和数组
May 25 Javascript
jQuery点击后一组图片左右滑动的实现代码
Aug 16 Javascript
如何让DIV可编辑、可拖动示例代码
Sep 18 Javascript
JS辨别访问浏览器判断是android还是ios系统
Aug 19 Javascript
js实现缓冲运动效果的方法
Apr 10 Javascript
canvas绘制多边形
Feb 24 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
Feb 27 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
Apr 26 Javascript
web页面和微信小程序页面实现瀑布流效果
Sep 26 Javascript
NProgress显示顶部进度条效果及使用详解
Sep 21 Javascript
微信小程序实现拨打电话功能的示例代码
Jun 28 Javascript
vue打开子组件弹窗都刷新功能的实现
Sep 21 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
在windows iis5下安装php4.0+mysql之我见
2006/10/09 PHP
smarty简单入门实例
2014/11/28 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
js实现的类似于asp数据字典的数据类型代码实例
2014/09/03 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
2016/02/05 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
利用Vue实现简易播放器的完整代码
2020/12/30 Vue.js
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
centos下更新Python版本的步骤
2013/02/12 Python
零基础学Python(一)Python环境安装
2014/08/20 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
python使用tkinter实现简单计算器
2018/01/30 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
BONIA官方网站:国际奢侈品牌和皮革专家
2016/11/27 全球购物
美国珠宝店:Helzberg Diamonds
2018/10/24 全球购物
Java面试题及答案
2012/09/08 面试题
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
简短的公司员工自我评价分享
2013/11/13 职场文书
保洁主管岗位职责
2013/11/20 职场文书
外企求职信范文分享
2013/12/31 职场文书
2014年圣诞节促销方案
2014/03/14 职场文书
2014年计生标语
2014/06/23 职场文书
幼师大班个人总结
2015/02/13 职场文书