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 冒泡事件阻止实现代码
Jan 27 Javascript
javascript创建和存储cookie示例
Jan 07 Javascript
javascript绘制漂亮的心型线效果完整实例
Feb 02 Javascript
js动态添加的DIV中的onclick事件简单实例
Jul 25 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
Aug 03 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
Sep 24 Javascript
给easyui的datebox控件添加清空按钮的实现方法
Nov 09 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
Dec 27 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
Sep 03 Javascript
vue+element tabs选项卡分页效果
Jun 29 Javascript
15分钟学会vue项目改造成SSR(小白教程)
Dec 17 Javascript
Vue+Spring Boot简单用户登录(附Demo)
Nov 12 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
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
php实现xml与json之间的相互转换功能实例
2016/07/07 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
深入理解(function(){... })();
2016/08/16 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
Django用户身份验证完成示例代码
2020/04/03 Python
keras之权重初始化方式
2020/05/21 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
python绘制汉诺塔
2021/03/01 Python
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
职业规划书如何设计?
2014/01/09 职场文书
物业公司的岗位任命书
2014/06/06 职场文书
幼儿园大班开学寄语
2014/08/02 职场文书
个人查摆剖析材料
2014/10/04 职场文书
2014年外联部工作总结
2014/11/17 职场文书
锅炉工岗位职责
2015/02/13 职场文书
外出考察学习心得体会
2016/01/18 职场文书
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers