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跑步算法的实现代码
Dec 04 Javascript
利用JS来控制键盘的上下左右键(示例代码)
Dec 14 Javascript
jquery xMarquee实现文字水平无缝滚动效果
Apr 29 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
Oct 19 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
Nov 02 Javascript
Javascript中For In语句用法实例
May 14 Javascript
jQuery常用且重要方法汇总
Jul 13 Javascript
SpringMVC返回json数据的三种方式
Dec 10 Javascript
讲解vue-router之命名路由和命名视图
May 28 Javascript
详解小程序原生使用ES7 async/await语法
Aug 06 Javascript
vue 解决computed修改data数据的问题
Nov 06 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
Sep 11 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中的CMS的涵义
2007/03/11 PHP
php的一些小问题
2010/07/03 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
PHP使用PHPexcel导入导出数据的方法
2015/11/14 PHP
Yii清理缓存的方法
2016/01/06 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
PHP微信H5支付开发实例
2018/07/25 PHP
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
JS 类型转换常见方法小结
2010/05/31 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
jQuery的框架介绍
2016/05/11 Javascript
JS随机排序数组实现方法分析
2017/10/11 Javascript
VUE路由动态加载实例代码讲解
2019/08/26 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
使用CodeMirror实现Python3在线编辑器的示例代码
2019/01/14 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
2020/05/22 Python
Python制作数据预测集成工具(值得收藏)
2020/08/21 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
电子商务专业学生的学习自我评价
2013/10/27 职场文书
元旦活动感言
2014/03/08 职场文书
秋季运动会开幕词
2015/01/28 职场文书
公司催款律师函
2015/05/27 职场文书
详解Redis集群搭建的三种方式
2021/05/31 Redis
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python