函數:對象
函數是javascript中的一種特殊形式的對象。它是第一個[b〕類資料類型(class data type)。這意味著我們能夠給它增加屬性。這裡有一些需要注意的有趣觀點:
對象的建立
就像剛才提及的,當我們定義一個函數時,javascript實際上在後台為你建立了一個對象。這個對象的名稱就是函數名本身。這個對象的類型是function。在下面的例子,我們也許不會意識到這一點,但我們實際上已經建立了一個對象:它叫做Ball。
Example 1
CODE:
function Ball() // 也許看起來有點奇怪,但是這個聲明
{ // 建立了一個叫做Ball的對象
i=1;
}
alert(typeof Ball); // 結果 "function"
我們甚至能將這個對象的內容列印出來而且它會輸出這個函數的實際代碼,Example2: 點擊 alert(Ball);來看看Ball的內容。
屬性的添加
我們能夠添加給Object添加屬性,包括對象function。因為定義一個函數的實質是建立一個對象。我們能夠“暗地裡”給函數添加屬性。比如,我們這裡定義了函數Ball,並添加屬性callsign。
CODE:
function Ball() // 也許看起來有點奇怪,但是這個聲明
{ // 建立了一個叫做Ball的對象,而且你能夠
} // 引用它或者象下面那樣給它增加屬性
Ball.callsign="The Ball"; // 給Ball增加屬性
alert(Ball.callsign); // 輸出 "The Ball"
指標
因為function是一個對象,我們能夠為一個function分配一個指標。如下例,變數ptr指向了對象myFunction。
CODE:
function myFunction(message)
{
alert(message);
}
var ptr=myFunction; // ptr指向了myFunction
ptr("hello"); // 這句會執行myFunction:輸出"hello"
我們能夠運行這個函數,就好像這個函數名已經被指標名代替了一樣。所以在上面,這行ptr("hello"); 和myFunction("hello");的意義是一樣的。
指向函數的指標在物件導向編程中相當有用。例如:當我們有多個對象指向同一個函數的時候(如下):
Example 4A
CODE:
function sayName(name)
{
alert(name);
}
var object1=new Object(); // 建立三個對象
var object2=new Object();
var object3=new Object();
object1.sayMyName=sayName; // 將這個函數指派給所有對象
object2.sayMyName=sayName;
object3.sayMyName=sayName;
object1.sayMyName("object1"); // 輸出 "object1"
object2.sayMyName("object2"); // 輸出 "object2"
object3.sayMyName("object3"); // 輸出 "object3"
因為只有指標被儲存(而不是函數本身),當我們改變函數對象自身的時候,所有指向那個函數的指標都會發生變化。我們能夠在底下看到:
Example 5:
CODE:
function myFunction()
{
alert(myFunction.message);
}
myFunction.message="old";
var ptr1=myFunction; // ptr1 指向 myFunction
var ptr2=myFunction; // ptr2 也指向 myFunction
ptr1(); // 輸出 "old"
ptr2(); // 輸出 "old"
myFunction.message="new";
ptr1(); // 輸出 "new"
ptr2(); // 輸出 "new"