JavaScript如何?“物件導向”的各種特徵

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.