欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript的函數(shù)第2/3頁(yè)

 更新時(shí)間:2006年07月28日 00:00:00   作者:  


指針的指向

我們能夠在一個(gè)函數(shù)創(chuàng)建之后重新分配它,但是我們需要指向函數(shù)對(duì)象本身,而不是指向它的指針。在下例中,我將改變myfunction()的內(nèi)容。

Example 6:

CODE:
function myFunction()
{
  alert("Old");
}
myFunction(); // 輸出 "Old"
myFunction=function()
{
  alert("New");
};
myFunction(); // 輸出 "New"

舊函數(shù)哪里去了??被拋棄了。

如果我們需要保留它,我們可以在改變它之前給它分配一個(gè)指針。

Example 6A:

CODE:
function myFunction()
{
  alert("Old");
}
var savedFuncion=myFunction;
myFunction=function()
{
  alert("New");
};
myFunction();    // 輸出 "New"
savedFuncion();  // 輸出 "Old"

不過(guò)要小心,象下面這樣的例子并不會(huì)有作用,因?yàn)槭莿?chuàng)建了另一個(gè)叫做myFunctionPtr的函數(shù)而不是修改它。

Example 6B:

CODE:
function myFunction()
{
  alert("Old");
}
var savedFunc=myFunction;
savedFunc=function()
{
  alert("New");
};
myFunction();            // 輸出 "Old"
savedFunc();             // 輸出 "New"

內(nèi)嵌函數(shù)

我們還能夠在一個(gè)函數(shù)中嵌套一個(gè)函數(shù)。下例,我有一個(gè)叫做getHalfOf的函數(shù),而在它里面,我有另一個(gè)叫做calculate的函數(shù)。

Example 7

CODE:

function getHalfOf(num1, num2, num3)    
{
  function calculate(number)
  {
    return number/2;
  }

  var result="";
  result+=calculate(num1)+" ";
  result+=calculate(num2)+" ";
  result+=calculate(num3);
}        
var resultString=getHalfOf(10,20,30);
alert(resultString);         // 輸出 "5 10 15"

你只能在內(nèi)部調(diào)用嵌套的函數(shù)。就是說(shuō),你不能這么調(diào)用:getHalfOf.calculate(10),因?yàn)閏alculate只有當(dāng)外部函數(shù)(getHalfOf())在運(yùn)行的時(shí)候才會(huì)存在。這和我們前面的討論一致(函數(shù)會(huì)被編譯,但只有當(dāng)你去調(diào)用它的時(shí)候才會(huì)執(zhí)行)。

調(diào)用哪個(gè)函數(shù)?

你也許正在想命名沖突的問(wèn)題。比如,下面哪一個(gè)叫做calculate的函數(shù)會(huì)被調(diào)用?

Example 8

CODE:

function calculate(number)
{
  return number/3;
}

function getHalfOf(num1, num2, num3)    
{
  function calculate(number)
  {
    return number/2;
  }

  var result="";
  result+=calculate(num1)+" ";
  result+=calculate(num2)+" ";
  result+=calculate(num3);
}        
var resultString=getHalfOf(10,20,30);
alert(resultString);         // 輸出 "5 10 15"

在這個(gè)例子中,編譯器會(huì)首先搜索局部?jī)?nèi)存地址,所以它會(huì)使用內(nèi)嵌的calculate函數(shù)。如果我們刪除了這個(gè)內(nèi)嵌(局部)的calculate函數(shù),這個(gè)代碼會(huì)使用全局的calculate函數(shù)。

函數(shù):數(shù)據(jù)類(lèi)型及構(gòu)造函數(shù)

讓我們來(lái)看看函數(shù)的另一個(gè)特殊功能--這讓它和其它對(duì)象類(lèi)型截然不同。一個(gè)函數(shù)能夠用來(lái)作為一個(gè)數(shù)據(jù)類(lèi)型的藍(lán)圖。這個(gè)特性通常被用在面向?qū)ο缶幊讨衼?lái)模擬用戶自定義數(shù)據(jù)類(lèi)型(user defined data type)。使用用戶自定義數(shù)據(jù)類(lèi)型創(chuàng)建的對(duì)象通常被成為用戶自定義對(duì)象(user defined object)。

數(shù)據(jù)類(lèi)型

在定義了一個(gè)函數(shù)之后,我們也同時(shí)創(chuàng)建了一個(gè)新的數(shù)據(jù)類(lèi)型。這個(gè)數(shù)據(jù)類(lèi)型能夠用來(lái)創(chuàng)建一個(gè)新對(duì)象。下例,我創(chuàng)建了一個(gè)叫做Ball的新數(shù)據(jù)類(lèi)型。

Example DT1

CODE:

function Ball()
{
}
var ball0=new Ball(); // ball0 現(xiàn)在指向一個(gè)新對(duì)象

alert(ball0);         // 輸出 "Object",因?yàn)?ball0 現(xiàn)在是一個(gè)對(duì)象

這樣看來(lái),ball0=new Ball()作了什么?new關(guān)鍵字創(chuàng)建了一個(gè)類(lèi)型是Object的新對(duì)象(叫做ball0)。然后它會(huì)執(zhí)行Ball(),并將這個(gè)引用傳給ball0(用于調(diào)用對(duì)象)。下面,你會(huì)看到這條消息:“creating new Ball”,如果Ball()實(shí)際上被運(yùn)行的話。

Example DT2

CODE:
function Ball(message)
{
  alert(message);
}
var ball0=new Ball("creating new Ball");  // 創(chuàng)建對(duì)象并輸出消息
ball0.name="ball-0";                      // ball0現(xiàn)在有一個(gè)屬性:name
alert(ball0.name);                        // 輸出 "ball-0"

我們可以把上面這段代碼的第6行看做是底下的代碼6-8行的一個(gè)簡(jiǎn)寫(xiě):

CODE:
function Ball(message)
{
  alert(message);
}
var ball0=new Object();
ball0.construct=Ball;
ball0.construct("creating new ball");  // 執(zhí)行 ball0.Ball("creating..");
ball0.name="ball-0";                     
alert(ball0.name);        

這行代碼ball0.construct=Ball和Example 4中的ptr=myFunction語(yǔ)法一致。

如果你還是不明白這行的含義那就回過(guò)頭再?gòu)?fù)習(xí)一下Example 4。注意:你也許考慮直接運(yùn)行ball0.Ball("..."),但是它不會(huì)起作用的,因?yàn)閎all0并沒(méi)有一個(gè)叫做Ball("...")的屬性,并且它也不知道你究竟想作些什么。

添加屬性

當(dāng)我們象上面那樣使用關(guān)鍵字new創(chuàng)建一個(gè)對(duì)象的時(shí)候,一個(gè)新的Object被創(chuàng)建了。我們可以在創(chuàng)建之后給這個(gè)對(duì)象添加屬性(就好像我在上面那樣添加屬性name。而接下來(lái)的問(wèn)題就是如果我們創(chuàng)建了這個(gè)對(duì)象的另外一個(gè)實(shí)例,我們得象下面那樣再次給這個(gè)新對(duì)象添加這個(gè)屬性。)

Example DT3 (creates 3 ball objects)

CODE:

function Ball()
{
}
var ball0=new Ball(); // ball0 現(xiàn)在指向了類(lèi)型Ball的一個(gè)新實(shí)例
ball0.name="ball-0";  // ball0 現(xiàn)在有一個(gè)屬性"name"

var ball1=new Ball();
ball1.name="ball-1";

var ball2=new Ball();

alert(ball0.name);    // 輸出 "ball-0"
alert(ball1.name);    // 輸出 "ball-1"
alert(ball2.name);    // 哦,我忘記給ball2添加“name”了!

我忘記給ball2添加屬性name了,如果在正式的程序中這也許會(huì)引發(fā)問(wèn)題。有什么好辦法可以自動(dòng)增加屬性呢?嗯,有一個(gè):使用this關(guān)鍵字。this這個(gè)詞在function中有特別的意義。它指向了調(diào)用函數(shù)的那個(gè)對(duì)象。讓我們看看下面的另一個(gè)示例,這時(shí)候我們?cè)跇?gòu)造函數(shù)中添加上這些屬性:

Example DT4

CODE:
function Ball(message, specifiedName)
{
  alert(message);
  this.name=specifiedName;               
}
var ball0=new Ball("creating new Ball", "Soccer Ball"); 
alert(ball0.name);                   // prints "Soccer Ball"

請(qǐng)記?。菏莕ew關(guān)鍵字最終使得構(gòu)造函數(shù)被執(zhí)行。在這個(gè)例子中,它將會(huì)運(yùn)行Ball("creating new Ball", "Soccer Ball");而關(guān)鍵字this將指向ball0。
因此,這行:this.name=specifiedName變成了ball0.name="Soccer Ball"。
它主要是說(shuō):給ball0添加屬性name,屬性值是Soccer Ball。
我們現(xiàn)在只是添加了一個(gè)name屬性給ball0,看起來(lái)和上一個(gè)例子中所做的很象,但卻是一個(gè)更好更具擴(kuò)展性的方法?,F(xiàn)在,我們可以隨心所欲的創(chuàng)建許多帶有屬性的ball而無(wú)需我們手動(dòng)添加它們。而且,人們也希望創(chuàng)建的Ball對(duì)象能夠清晰的看懂它的構(gòu)造函數(shù)并且能夠輕松找出Ball的所有屬性。讓我們添加更多屬性到Ball里。

Example DT5

CODE:

function Ball(color, specifiedName, owner, weight)
{
  this.name=specifiedName;               
  this.color=color;
  this.owner=owner;
  this.weight=weigth;
}
var ball0=new Ball("black/white", "Soccer Ball", "John", 20); 
var ball1=new Ball("gray", "Bowling Ball", "John", 30); 
var ball2=new Ball("yellow", "Golf Ball", "John", 55); 
var balloon=new Ball("red", "Balloon", "Pete", 10); 

alert(ball0.name);                        // 輸出 "Soccer Ball"
alert(balloon.name);                      // 輸出 "Balloon"
alert(ball2.weight);                      // 輸出 "55"

嘿!使用面向?qū)ο笮g(shù)語(yǔ),你能夠說(shuō)Ball是一個(gè)擁有如下屬性的對(duì)象類(lèi)型:name, color, owner, weight。

將對(duì)象賦給屬性

我們并沒(méi)被限制只能添加形如字符串或者數(shù)字之類(lèi)的簡(jiǎn)單數(shù)據(jù)類(lèi)型作為屬性。我們也能夠?qū)?duì)象賦給屬性。下面,supervisor是Employee的一個(gè)屬性.

Example DT6

CODE:

 

function Employee(name, salary, mySupervisor)
{
  this.name=name;               
  this.salary=salary;
  this.supervisor=mySupervisor;
}
var boss=new Employee("John", 200);

var manager=new Employee("Joan", 50, boss); 
var teamLeader=new Employee("Rose", 50, boss); 

alert(manager.supervisor.name+" is the supervisor of "+manager.name);
alert(manager.name+"\'s supervisor is "+manager.supervisor.name);

 

會(huì)輸出什么呢?

就像你在上面這個(gè)例子中看到的那樣,manager和teamLeader都有一個(gè)supervisor屬性,而這個(gè)屬性是類(lèi)型Employee的一個(gè)對(duì)象。

相關(guān)文章

最新評(píng)論