javascript面向对象编程--静态方法

在面向对象编程中,类是不能够直接访问的,必须实例化后才可以访问,大多数方法和属性与类的实例产生联系。但是静态属性和方法与类本身直接联系,可以从类访问,如javascript的核心对象中的Math和Global都是静态对象,不需实例化,可以直接访问

类的静态成员(属性和方法)包括私有和共有两种类型

var F=(function(){

    var _a=1;   //闭包体的私有变量

  this.a=_a;     //公共属性

 this.get1=function(){return _a;};//公共方法

this.set1=function(x){_a=x;};

function set5(x){_a=x}; //私有方法

function get5(){ return _a};  //私有方法

return function(){  //返回的构造函数类

   this.get2=function(){ return _a};   // 返回的公共方法可以 访问私有变量 

   this.set2=function(x){_a=x;};    //返回的公共方法可以 访问私有变量 ;

 }

})();

//定义类的静态公共方法和属性

F.get3=function(){ return get1();}

F.set3=function(x){set1(x);}

F.a=a;

访问静态成员

 alert(F.get3());//1  alert(F.a);//1  F.set3(2) alert(F.get3());//2

注意实例化F时,所调用的是内层函数,是无法访问外层函数的公共方法和属性的

   var  a=new F();

   alert(a.get2());//1

   a.set2(2);

alert(a.get2());//2

但以下是错误的:闭包体内的变量属性方法不管私有还是公有,级别比较低的F类都是无法访问的

 alert(a.get1()); a.set1(2); alert(a.get2())-----无权访问的

但是对与闭包体内的所有对象都可以访问闭包体内的私有公有的变量属性 方法,也可以访问类F(根据作用域链向上访问闭包所有成员)

F.prototype={

  get4:function(){ return get1();},

  set4:function(x){set1(x)};

};

var a=new F(); //实例化类F

alert(a.get4()); //1

同理利用闭包体也可以实现对数据的封装,而且这种封装是非常有效牢靠的

猜你喜欢

转载自blog.csdn.net/wenmin1987/article/details/82829621