JavaScript物件導向—匿名函數和匿名類,以及原生類

來源:互聯網
上載者:User
1.關於匿名類

    var  class1={p1:value1,p2:value2};

    這個也可以寫成

    var class1={};

     class1.p1=value1;

     class1.p2=value2;

首先所有的匿名類都是繼承與Object核心對象的,var class1={} 意味著執行個體化了一個Object對象,它擁有Object對象的原生屬性和原生方法。

但是你不能為匿名類添加原生方法,例如這樣寫是錯誤的:

class1.prototype.func1=function(){};

你也不能嘗試用new() 方法來構造一個新的與class1有相同的屬性的新對象,因為它已經執行個體化了。以下寫法也是錯的:

var classB=new classA();

這是無法構造的,

準確的說,匿名類實際上是繼承與Object的某一個半執行個體,相當於C#中的靜態類。你可以為他添加方法和屬性

例如:

class1.func1=function(){}

調用的時候就這樣:

class1.func1();  酷似C#中的靜態類

但是你可以為Object添加原生函數,這樣你的匿名類(實際上是所有的類)都有這個方法

例如:

var class1={};

class1.p1=value1;

class1.p2=value2;

Object.prototype.func1=function(){  alert("1")  };

class1.func1();

是沒有問題的,但是這樣一來,所有的執行個體化對象都有了func1()方法。實際應用中應該避免給Object類添加原生方法。

2.關於匿名函數

先說說關於Javascript的函數:

可以這樣說,JavaScript中一切皆是對象,function自然不例外,function可以作為函數,類,也可以當成一個被函數對象返回

看下面的例子:

function a()
{

  alert("Hello Febird!");

   this.aa="aa";
  this.show=function ()
  {
        alert(this.aa);
  };

   this.sayHello=function()

  {

      return function()   {alert("hello"); }   ;

  };
}

var aaa=new a();
aaa.show();

aaa.sayHello();

其中最外面的一個function是定義了一個類 a ,他有屬性aa,方法show(),sayHello();這兩個都是匿名函數,而sayHello中的function便是函數作為一個傳回值的例子。

實際上可以這樣想,匿名函數就是一塊沒有命名的代碼塊,當你把他賦值給別的變數的時候,那麼那個變數就是一個函數,準確的說那是一個函數指標^_^。

在Javasript中,匿名函數是很有特點的東西了,也是非常有用,也是有些難以理解的。

比如在寫Ajax引用的時候,如果不依靠別的JSF,自己寫一個通用的Ajax話,一般這樣寫:

var xhr=new XMLHttpRequest(); //已經封裝,可以適應不同的瀏覽器;

function DoAjax ()

{

xhr.onreadystatechange=processFunction;

xhr.open("GET",url,true);

xhr.send(null);

}

function processFunction()

{

   //do something with XMLHttpRequest;

   if(xhr.readState!=4||xhr.status!=200) return false;

    alert(xhr.responseText);

}

在一般的Ajax引用中,也許只要一個XMLHttpRequest對象,而且onreadystatechange的處理函數必須沒有參數,有參數就出錯,

所以,一般經常會寫一個全域變數XMLHttpRequest,再在processFunction中用到這個全域變數,但是如果我要建立幾個

XMLHttpRequest的並發串連怎麼辦呢?這個就不能用全域變數了,但是處理函數又不能有參數,怎麼搞,可以這樣:

function DoAjax ()

{

var xhr=new XMLHttpRequest();

xhr.onreadystatechange=processFunction(xhr);

xhr.open("GET",url,true);

xhr.send(null);

}

function processFunction(_xhr)

{

   return function()

  {

   //do something with XMLHttpRequest;

    if(_xhr.readState!=4||_xhr.status!=200) return false;

    alert(_xhr.responseText);

  };

}

怎麼理解?雖然processFunction函數有參數,但是它返回的函數沒有參數!而這兩個函數之間是怎麼進行的值傳遞呢?

這裡不妨引用一句話:

“為了函數能夠正確的執行,需要被函數使用的,詞法範圍中的,非全域資料,
存在於函數的閉包之中。”

可以這樣理解:

當我們把processFunction()返回的函數,在processFunction之外使用的時候,依然要記得自己被定義時的上級範圍中的各種變數的值。這些需
要被記住的值,就是“閉包”。

3.關於原生對象

原生,即prototype,他提供我們了擴充、改造原有對象的方法。例如我們可以為已知對象,包括JavaScript的核心對象Array,Number,Math,Object,Boolean等和自訂類添加方法或者屬性。

例如:

Number.prototype.toHexString = function () {

return this.toString(16);

};

var num=10

alert(num.toHexString());

輸出A;

你可以為Object對象添加方法,這樣,以後任意一個對象都有這個方法,因為其它對象都是從Object繼承而來的。

你也可以再造現有函數

Function.prototype.toString = function () {

return “Function Locked”;

};

4.關於This

在JavaScript中,並沒有嚴格的物件導向概念,自然也沒有類的建構函式這樣的概念。var o=new Obj();這樣的文法,看起來似乎和Java/C++相當類似,但是他背後的執行過程是不同的。首先,解譯器會new一個空的Object對象。然後將這個空的Object,作
為隱藏的參數傳遞給function Obj()。在Obj函數中訪問到的this,其實就是這個傳入的空的Object 對象。所以,如果這個Object,

並非為空白,這就是所謂:“this關鍵字關聯於執行時的範圍”的含義。

如果你想把一個函數作為“建構函式”,那麼就不要在函數的最後加上return語句。因為如果沒有return語句,new算符返回的就是

那個被操作過以後的this。一旦你通過return返回了別的東西,這個this就被廢棄掉了。對於函數的調用者來說,就會相當的困惑。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.