javascript 静态对象和构造函数的使用和公私问题
作者:bea
先看: 代码如下: var objJson={ op1:'objJson option1', fn1:function(){ alert(this.op1) } } 在这种形式的声明下,你可以通过objJson.op1或者objJson.fn1()来直接访问内部的属性,这没有问题。但是如果是这样: 代码如下: var objFn=function(){ this.op1='objFn.op1'; this.op2=f
先看:
代码如下:
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)
有用 | 无用
代码如下:
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 竖直伸缩菜单(百度)
- CSS 网页顶部固定工具栏拖动无闪烁实现代码
- CSS 图片横向排列实现代码
- select下拉选择框美化实现代码(js+css+图片)
- 纯CSS实现的竖向导航菜单
- javascript 图片滑动切换代码
- js 编写规范
- jquery validation插件表单验证的一个例子
- Jquery 实现Tab效果 思路是js思路
- 走马灯效果代码js appendChild实现的无缝滚动
- JavaScript页面刷新与弹出窗口问题的解决方法
- 在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
- js 按照指定间隔 向字符串中插入随机字符串的实现代码
- jQuery对象和DOM对象的相互转化实现代码
- Javascript 自定义类型方法小结
- Javascript Cookie读写删除操作的函数
- 28个JS验证函数收集
- 用js脚本控制asp.net下treeview的NodeCheck的实现代码