现在的位置: 首页 > 综合 > 正文

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

2013年09月17日 ⁄ 综合 ⁄ 共 3929字 ⁄ 字号 评论关闭

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***********

9、继承
  使用prototype实现继承:
function MyClass()
{
    this.Property = "value";
    this.Method = function(){}
}

var obj = new MyClass();
obj.prototype.Property1 = "value1";
obj.prototype.Method1 = function(){}

   好了,以上就是小弟总结出来的技巧,希望对大家有所帮助。
   同时,我再次也倡议大家:如果多个函数能够重用,或者解决某个问题能够重用,那么就把这些JavaScript的代码写成一个类。封装性好,重用性也好!

*********************************
* 阿福原创                      *
* QQ:12304685                   *
* mail:ah_fu126@hotmail.com     *
*********************************

抱歉!评论已关闭.