JavaScript如何实现“面向对象”的各种特征

  

JavaScript是一种基于对象的语言,只能使用系统提供的内置对象。如何才能用JavaScript写出象面向对象语言一样的代码呢?

1、定义一个类(class   &   field) 

 

代码
//***********code   begin***********  
  //定义类  
  function   MyClass()  
  {  
  
this.field1;     //定义类的成员  
  this.field2;  
  }  
  
var   obj   =   new   MyClass();     //调用类  
  obj.aa   =   1;     //访问成员  
  obj   =   null;     //释放对象  
//
***********code   end*********** 

2、定义类的方法(method)

 

代码
//***********code   begin***********  
  function   MyClass()  
  {  
  
this.method1   =   _func1;  
  
this.method2   =   _func2;  
   
  
//函数  
  function   _func1(aa)  
  {  
  
//code   here  
  }  
  }  
  
function   _func2(aa,bb)     //外部函数  
  {  
  
//code   here  
  }  
  
var   obj   =   new   MyClass();     //调用类  
  obj.method1("参数");     //调用方法  
  obj   =   null;     //释放对象  
  //***********code   end***********  
  

  注意:a.把一个函数绑定到方法的时候,不能加参数和括号;  
          b. 绑定为方法的函数可以在类的外部或内部(当然,在别的文件中也行)

3、属性(Property)

抱歉,JavaScript不能实现象C#中的属性那样的效果,定义的方法和数据成员都是公有的。  
  但是,我们可以用方法来访问属性。  

代码
//***********code   begin***********   
  function   MyClass()   
  {   
  
var   privateData   =   0;   
  
this.getData   =   _func1;   
  
this.setData   =   _func2;   
    
  
//获取成员   
  function   _func1()   
  {   
  
return   privateData;   
  }   
    
  
//设置成员   
  function   _func2(value)   
  {   
  privateData   
=   value;   
  }   
  }   
  
var   obj   =   new   MyClass();     //调用类   
  obj.setData(100);   
  alert(obj.getData());   
  obj   
=   null;     //释放对象   
  //***********code   end***********   

  注意:a.这里其实是定义一个函数内的局部变量,外部无法访问,所以,访问成员的方法也要定义在类里面。

4、私有成员(public   &   private)

        JavaScript中定义的类中,成员都是可以访问的,就好像默认加上了public。  
        如何实现成员的私有呢?看了3的例子可能就明白了,在class里面定义局部变量就能够使成员私有。  
        方法的私有也是一样,只要函数不绑定就行了。

代码
//***********code   begin***********   
  function   MyClass()   
  {   
  
var   privateData   =   0;   
  
this.getData   =   _func1;   
  
this.setData   =   _func2;   
    
  
//获取成员   
  function   _func1()   
  {   
  
return   privateData;   
  }   
    
  
//设置成员   
  function   _func2(value)   
  {   
  __privateMethod();     
//访问私有的方法,外部不能访问   
  privateData   =   value;   
  }   
    
  
function   __privateMethod()   
  {   
  privateData   
=   1000;     //私有方法中访问私有成员   
  }   
  }   
  
var   obj   =   new   MyClass();     //调用类   
  obj.setData(100);   
  obj.getData();   
  obj   
=   null;     //释放对象   
  //***********code   end***********   

  注意:a.公有方法中能够访问公有的方法和成员,也能访问私有的方法和成员;但是,私有的方法只能访问私有的方法和成员。

 5、对对象本身的访问(this)

看了上面一节,朋友们一定发现这样的问题:私有的方法中如何访问对象本身?  
        如果一个函数,没有采用this.方法名=函数名的格式绑定,那么函数中使用this将产生错误。如何解决呢?

代码
//***********code   begin***********   
  function   MyClass()   
  {   
  
var   me   =   this;     //注意这里,将对象本身引用到另外一个对象。   
  var   privateData   =   0;   
  
this.publicData;   
  
this.getData   =   _func1;   
  
this.setData   =   _func2;   
    
  
//获取成员   
  function   _func1()   
  {   
  
return   privateData;   
  }   
    
  
//设置成员   
  function   _func2(value)   
  {   
  
this.publicData   =   100;     //访问共有的数据成员   
  __privateMethod();     //访问私有的方法,外部不能访问   
  privateData   =   value;   
  }   
    
  
function   __privateMethod()   
  {   
  me.publicData   
=   200;     //在私有方法中访问共有方法   
  privateData   =   1000;     //私有方法中访问私有成员   
  }   
  }   
  
var   obj   =   new   MyClass();     //调用类   
  obj.setData(100);   
  obj.getData();   
  obj   
=   null;     //释放对象   
  //***********code   end***********   

总结:在定义类的时候,将对象本身赋值给一个局部变量,其他函数就能通过访问这个变量来访问类了。

 6、函数重载(overload)  
函数重载能够通过不同的参数,调用同名的不同函数。JavaScript中也可以,只是要麻烦些:

代码
//***********code   begin***********   
  function   func1()     //在定义函数的时候可以指定,也可以不指定参数   
  {   
  
var   nArgCount   =   func1.arguments.length;   
  
switch(nArgCount)   
  {   
  
case   0:     //没有参数   
  //code   here   
  break;   
  
case   1:     //一个参数   
  //code   here   
  break;   
  …………   
  
default:   
  
//code   here   
  break;   
  }   
  }   
  
//***********code   end***********   

7、构造函数(Constrcutor) 
呵呵,因为类本身就是一个函数,所以把代码直接写在函数里面就相当于构造函数了。  

代码
//***********code   begin***********   
  function   MyClass()   
  {   
  
this.publicData;   
  
//下面的代码相当于构造函数   
  this.publicData   =   123;   
  alert(
this.publicData);   
  }   
  
var   obj   =   new   MyClass();     //调用类   
  obj   =   null;     //释放对象   
  //***********code   end***********   

注意:构造函数在这里没有使用参数,可以结合第6个技巧,做出构造函数参数的效果。

8、自定义事件(event)  
JavaScript中,函数本身也是对象,可以直接使用,所以,定义自己的事件也很简单 

代码
//***********code   begin***********   
  function   MyClass()   
  {   
  
var   privateData   =   0;   
  
this.setData   =   _setData;   
  
this.OnDataChange   =   null;   
    
  
function   _setData(value)   
  {   
  privateData   
=   value;   
  
this.OnDataChange();     //引发事件   
  }   
  }   
  
function   MyEvent()   
  {   
  alert(
"你改变了数值!");   
  }   
  
var   obj   =   new   MyClass();     //调用类   
  obj.OnDataChange   =   MyEvent;   
  obj.setData(
1234);   
  obj   
=   null;     //释放对象   
  //***********code   end***********   


 

 

 

posted @ 2010-03-31 16:56  一抹微蓝  阅读(359)  评论(0)    收藏  举报