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 相关文章推荐
ExtJS 入门
Oct 29 Javascript
JS对HTML标签select的获取、添加、删除操作
Oct 17 Javascript
jquery如何判断某元素是否具备指定的样式
Nov 05 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
Nov 10 Javascript
node.js中的path.join方法使用说明
Dec 08 Javascript
node.js中的url.format方法使用说明
Dec 10 Javascript
JavaScript中textRange对象使用方法小结
Mar 24 Javascript
在JavaScript的正则表达式中使用exec()方法
Jun 16 Javascript
浅谈VUE监听窗口变化事件的问题
Feb 24 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
Oct 25 Javascript
前端深入理解Typescript泛型概念
Mar 09 Javascript
springboot+vue实现文件上传下载
Nov 17 Vue.js
新老版本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
使用 MySQL Date/Time 类型
2008/03/26 PHP
php从文件夹随机读取文件的方法
2015/06/01 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
javascript 模拟点击广告
2010/01/02 Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
2012/01/13 Javascript
jQuery实现公告文字左右滚动的实例代码
2013/10/29 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
javascript中attribute和property的区别详解
2014/06/05 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
Python urlopen 使用小示例
2008/09/06 Python
在Mac OS系统上安装Python的Pillow库的教程
2015/11/20 Python
python通过getopt模块如何获取执行的命令参数详解
2017/12/29 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
浅谈Python爬虫基本套路
2019/03/25 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
python3下pygame如何实现显示中文
2020/01/11 Python
树莓派升级python的具体步骤
2020/07/05 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
新教师工作感言
2014/02/16 职场文书
工作推荐信范文
2014/05/10 职场文书
大学生工作自荐书
2014/06/16 职场文书
企业财务总监岗位职责
2015/04/03 职场文书
用python画城市轮播地图
2021/05/28 Python
oracle delete误删除表数据后如何恢复
2022/06/28 Oracle