javascript 静态对象和构造函数的使用和公私问题

 更新时间:2010年03月02日 12:08:05   作者:  
静态对象和构造函数的使用区别 平常我们会经常使用JSON形式,或者var obj=function(){}亦或function(){}这么几种对象的构建办法,有时会认为这是等价的办法,然而他们还有不同。
先看:
复制代码 代码如下:

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数组克隆简单实现方法

    这篇文章主要介绍了javascript数组克隆简单实现方法,实例分析了JavaScript中concat用于数组克隆的使用技巧,需要的朋友可以参考下
    2015-12-12
  • js location.replace与location.reload的区别

    js location.replace与location.reload的区别

    js location.replace与location.reload的区别,经常能用的到,需要的朋友可以可以下。
    2010-09-09
  • 深入理解JavaScript中Ajax

    深入理解JavaScript中Ajax

    Ajax不是一种新的编程语言,而是使用现有标准的新方法。本文重点给大家介绍javascript中ajax知识,非常不错,感兴趣的朋友参考下
    2016-08-08
  • JS创建或填充任意长度数组的小技巧汇总

    JS创建或填充任意长度数组的小技巧汇总

    在JavaScript 中,我们往往会遇到需要使用某些默认值来填充数组的情况,那么都有哪些方式可以完成这样的任务呢?这篇文章主要给大家介绍了关于JS创建或填充任意长度数组的小技巧,需要的朋友可以参考下
    2021-10-10
  • JavaScript防止表单重复提交的方法

    JavaScript防止表单重复提交的方法

    在web开发中,防止表单的重复提交是一个非常重要的环节。重复提交会导致数据混乱,甚至可能导致系统崩溃,今天我们将带领大家从小白级别到大神级别的程序员,一起来学习如何在实际项目中避免表单的重复提交
    2023-04-04
  • JS计算两个时间相差分钟数的方法示例

    JS计算两个时间相差分钟数的方法示例

    这篇文章主要介绍了JS计算两个时间相差分钟数的方法,结合完整实例形式分析了javascript针对日期时间的转换与计算相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • javascript 常用验证函数总结

    javascript 常用验证函数总结

    随着做项目数量的越来越越多,其中用到js的地方很多相同,这里自己整理了一些常用表单验证的js方法,虽然和其他js验证框架有一定的差距,但是毕竟是自己总结的一些东西,在此与纪录分享一下。
    2016-06-06
  • 微信小程序把百度地图坐标转换成腾讯地图坐标过程详解

    微信小程序把百度地图坐标转换成腾讯地图坐标过程详解

    这篇文章主要介绍了微信小程序把百度地图坐标转腾讯地图坐标过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 15分钟深入了解JS继承分类、原理与用法

    15分钟深入了解JS继承分类、原理与用法

    这篇文章主要介绍了JS继承分类、原理与用法,结合实例形式较为详细的总结分析了javascript原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承和寄生组合式继承等相关原理及使用方法,需要的朋友可以参考下
    2019-01-01
  • JavaScript的9种继承实现方式归纳

    JavaScript的9种继承实现方式归纳

    这篇文章主要介绍了JavaScript的9种继承实现方式归纳,本文讲解了原型链继承、原型继承(非原型链)、临时构造器继承、属性拷贝、对象间继承等继承方式,需要的朋友可以参考下
    2015-05-05

最新评论