JavaScript 是一段段地執行的。一段代碼中的定義式函數語句會優先執行,這似乎有點象靜態語言的編譯概念。所以,這一特征也被有些人稱為:JavaScript 的“預編譯”。
函數就是對象,隻不過比一般的對象多瞭一個括號“()”操作符,這個操作符用來執行函數的邏輯。
call方法舉例說明
function WhoAmI() //定義一個函數WhoAmI
{
alert("I'm " + this.name + " of " + typeof(this));
};
WhoAmI(); //此時是this 當前這段代碼的全局對象,在瀏覽器中就是window 對象,其
name 屬性為空字符串。輸出:I'm of object
var BillGates = {name: "Bill Gates"};
BillGates.WhoAmI = WhoAmI; //將函數WhoAmI 作為BillGates 的方法。
BillGates.WhoAmI(); //此時的this 是BillGates。輸出:I'm Bill Gates of obje
ct
var SteveJobs = {name: "Steve Jobs"};
SteveJobs.WhoAmI = WhoAmI; //將函數WhoAmI 作為SteveJobs 的方法。
SteveJobs.WhoAmI(); //此時的this 是SteveJobs。輸出:I'm Steve Jobs of o
bject
WhoAmI.call(BillGates); //直接將BillGates 作為this,調用WhoAmI。輸出:I'm B
ill Gates of object
WhoAmI.call(SteveJobs); //直接將SteveJobs 作為this,調用WhoAmI。輸出:I'
m Steve Jobs of object
BillGates.WhoAmI.call(SteveJobs); //將SteveJobs 作為this,卻調用BillGates 的
WhoAmI 方法。輸出:I'm Steve Jobs of object
SteveJobs.WhoAmI.call(BillGates); //將BillGates 作為this,卻調用SteveJobs 的
WhoAmI 方法。輸出:I'm Bill Gates of object
WhoAmI.WhoAmI = WhoAmI; //將WhoAmI 函數設置為自身的方法。
WhoAmI.name = "WhoAmI";
WhoAmI.WhoAmI(); //此時的this 是WhoAmI 函數自己。輸出:I'm WhoA
mI of function
({name: "nobody", WhoAmI: WhoAmI}).WhoAmI(); //臨時創建一個匿名對象並
設置屬性後調用WhoAmI 方法。輸出:I'm nobody of object
在 JavaScript 中,prototype 不但能讓對象共享自己財富,而且prototype 還有尋根問祖的
天性,從而使得先輩們的遺產可以代代相傳。當從一個對象那裡讀取屬性或調用方法時,如果該對象自身
不存在這樣的屬性或方法,就會去自己關聯的prototype 對象那裡尋找;如果prototype 沒有,又會去p
rototype 自己關聯的前輩prototype 那裡尋找,直到找到或追溯過程結束為止。
1 function Person(name) //基類構造函數
2 {
3 this.name = name;
4 };
5
6 Person.prototype.SayHello = function() //給基類構造函數的prototype 添加方法
7 {
8 alert("Hello, I'm " + this.name);
9 };
10
11 function Employee(name, salary) //子類構造函數
12 {
13 Person.call(this, name); //調用基類構造函數
14 this.salary = salary;
15 };
16
17 Employee.prototype = new Person(); //建一個基類的對象作為子類原型的原型,
這裡很有意思
18
19 Employee.prototype.ShowMeTheMoney = function() //給子類添構造函數的pr
ototype 添加方法
20 {
21 alert(this.name + " $" + this.salary);
22 };
23
24 var BillGates = new Person("Bill Gates"); //創建基類Person 的BillGates 對象
25 var SteveJobs = new Employee("Steve Jobs", 1234); //創建子類Employee
的SteveJobs 對象
26
27 BillGates.SayHello(); //通過對象直接調用到prototype 的方法
21
28 SteveJobs.SayHello(); //通過子類對象直接調用基類prototype 的方法,關註!
29 SteveJobs.ShowMeTheMoney(); //通過子類對象直接調用子類prototype 的方法
30
31 alert(BillGates.SayHello == SteveJobs.SayHello); //顯示:true,表明prototyp
e 的方法是共享的
本文出自“mayi-hetu”