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 相关文章推荐
javascript 处理HTML元素必须避免使用的一种方法
Jul 30 Javascript
jquery foreach使用示例
Sep 12 Javascript
javascript实现英文首字母大写
Apr 23 Javascript
js类式继承与原型式继承详解
Apr 07 Javascript
javascript解决小数的加减乘除精度丢失的方案
May 31 Javascript
jQuery中ScrollTo用法示例
Sep 04 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
Aug 18 Javascript
使用watch在微信小程序中实现全局状态共享
Jun 03 Javascript
js布局实现单选按钮控件
Jan 17 Javascript
JavaScript计算出两个数的差值
Mar 19 Javascript
Vue SSR 即时编译技术的实现
May 06 Javascript
手把手教你如何编译打包video.js
Dec 09 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
图形数字验证代码
2006/10/09 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
Angular.js中下拉框实现渲染html的方法
2017/06/18 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
python单链表实现代码实例
2013/11/21 Python
深入Python函数编程的一些特性
2015/04/13 Python
PyQt5每天必学之工具提示功能
2018/04/19 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
基于keras输出中间层结果的2种实现方式
2020/01/24 Python
Python通过Pillow实现图片对比
2020/04/29 Python
Python如何实现远程方法调用
2020/08/07 Python
Pandas直接读取sql脚本的方法
2021/01/21 Python
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
Puma印度官网:德国运动品牌
2019/10/06 全球购物
CHRONEXT英国:您的首选奢华腕表目的地
2020/03/30 全球购物
生产车间主管岗位职责
2013/12/28 职场文书
农村改厕实施方案
2014/03/22 职场文书
学校百日安全活动总结
2015/05/07 职场文书