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

 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***********  
  注意:a.可惜,我还没有想出如何根据参数类型而作出判断的方法。  
   
  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***********  
   
   
        好了,以上就是小弟总结出来的技巧,希望对大家有所帮助。  
        同时,我再次也倡议大家:如果多个函数能够重用,或者解决某个问题能够重用,那么就把这些JavaScript的代码写成一个类。封装性好,重用性也好!  
   
   
  *********************************  
  *   阿福原创                                             *  
  *   QQ:12304685                                       *  
  *   mail:ah_fu126@hotmail.com           *  

 

 

var B=function(){}
var A=B.prototype={
    b:
123,
    a:
function(){alert(this.b)}
}
var a=new B();
a.a()
A.a();

--------

 

var B=function(){}
var A={
    b:
null
}
A.b
=B.prototype={
    b:
123,
    a:
function(){alert(this.b)}
}
var a=new B();
a.a()
A.b.a();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值