zl程序教程

您现在的位置是:首页 >  前端

当前栏目

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

JavaScript静态对象 问题 使用 构造函数 公私
2023-06-13 09:14:16 时间
先看:
复制代码代码如下:

varobjJson={
  op1:"objJsonoption1",
  fn1:function(){
    alert(this.op1)
  }
}

在这种形式的声明下,你可以通过objJson.op1或者objJson.fn1()来直接访问内部的属性,这没有问题。但是如果是这样:
复制代码代码如下:

varobjFn=function(){
  this.op1="objFn.op1";
  this.op2=function(){
    alert(this.op1)
  };
}

那么如果你直接objFn.op1或者objFn.op2()来访问内部的属性的话,就不行了,因为这个时候他还不是个对象。
所以我们需要将他实例化
复制代码代码如下:
varinst=newobjFn();
alert(inst.op1);
inst.op2();

这样就可以得到你想要的值了。
如果你想复制JSON形式的对象,很简单,但是有一个问题:
复制代码代码如下:
varnewone=objJson;
newone.op1="changed";
alert("objJson.op1");

你会发现原来的对象中的op1的值也发生了改变。但是如果使用的第二种的对象声明的办法,那么修改只是在实例的内部,不会影响其他的实例。
所以像JSON这样的静态对象适合在写一些常用的库的时候使用,有他自己的命名空间,谁也不会干扰到谁,而且方便使用。
构造函数的"公有""私有"属性
我们将上面的构造函数做一个修改:
复制代码代码如下:
varobjFn=function(){
  varpri1="私有变量";
  this.op1="公共变量";
  this.op2=function(){
    alert(pri1+","+this.op1);
  };
};
varo=newobjFn();
alert(typeofo.pri1+","+typeofo.op1);//undefined,string
o.op2();//私有变量,公共变量

私有变量在对象外是不允许访问的,所有typeof以后是undefined。下面我们看看私有方法的访问:
复制代码代码如下:
varobjFn=function(){
varpri1="私有变量";
varpri2=function(){
this.op2();
};
  this.op1="公共变量";
  this.op2=function(){
    alert(pri1+","+this.op1);
  };
  this.acPri=function(){
    pri2.call(this);
  };
};
varo=newobjFn();
o.acPri();//私有变量,公共变量

注意到这里因为JavaScript的闭包特性,我们通过公有方法acPri()调用私有方法pri2的时候需要使用call将程序的上下文传递进去,不过就是这个看起来绕来绕去的太晕,可以稍稍的包装一下:
复制代码代码如下:
varobjFn=function(){
varmy=this;
varpri1="私有变量";
varpri2=function(){
my.op2();
};
  this.op1="公共变量";
  this.op2=function(){
    alert(pri1+","+this.op1);
  };
  this.acPri=function(){
    pri2.();
  };
};
varo=newobjFn();
o.acPri();//私有变量,公共变量

当然最后的结果还是不变。
转载请保留以下信息
作者:北玉(tw:@rehawk)