前一篇中我們講到,Javascript中任何對象o instanceof Object,都會返回true,因此,從這個層面來看,我以認為Javascript中一切都是對象。但是Javascript並不是一種完全面向對象的編程語言,因此對於簡單數據類型,我們這樣的討論並沒有太大的意義。我們這裡所說的對象,主要是指一些復雜的對象,包括函數對象。
我們先從最常見的說起,
varo = newObject()
這個語句定義瞭一個最普通的對象o,這也是面向對象語言中最長見的對象定義方法。Javascript中所有的對象都可以通過這種方式來定義:
varo = newTypeDef()
這裡TypeDef指的是類型的定義,在Javascript內置的類型定義有以下幾種:Object,Function,Date,Array(還有Boolean,這裡我們不討論這種簡單類型)
除此之外,一些類型還有一些簡單的定義方式,或者可以稱之為初始化方式,定義的同時進行初始化,例如:
vararray1 = [];//初始化一個空數組
vararray2 = [1, 2, 3];//初始化一個包含1、2、3三個元素的數組
varjson1 = {};//和json1 = new Object();的結果是一樣的
varjson2 = {
name: "json2",
mytype: "object"
};
一種是數組的初始化方式,一種是現在現在常見的Json寫法定義。其中json2是一個對象,包含瞭name和mytype兩個屬性,當然,我們也可以在聲明之後再為它添加其他的成員,包括屬性成員和行為(函數)成員,如下所示:
json1.newProperty = "This is json1's new property";
json2.newProperty = "This is json2's new property";
json1.newFunc = function(){
// json1's action
};
json2.newFunc = function(){
// json2's action
};
這樣,我們變為json1和json2分別都增加瞭一個newProperty屬性和一個newProperty方法。到這裡我們找到瞭一個自定義復雜對象的途徑,實例化一個Object的對象,然後為其添加屬性成員和行為成員,或者是通過Json的聲明方式,來初始化一個包含屬性成員和行為成員的對象,或者是混合兩種方式都是可以的。但是這種對象有一個缺點就是無法復用,因為它不是類型,本身就是一個實例,所以說隻存在這樣一個實例,很多情況下滿足不瞭我們的需求,這個我們會在後續的章節中談論到。現在我們繼續這個對象,我們來使用Json完整定義一個:
varmyObj = {
name: "my object",
howToDefined: "Json",
showMyName: function(){
returnthis.name;
}
}
當我們通過myObj.showMyName時,會返回”my object“。
我們看到,在myObj的showMyName的function定義中,我們引入瞭this關鍵字,這是面向對象編程中最常用到的一個關鍵字,而且,在Javascript中也很難理解。在上面得例子中,就是表示myObj這個對象,在這種單一的對象中,理解起來要容易的多,因為它就代表的是myObj對象,所以這個地方returnthis.name也可以用return myObj.name 來代替的。讓人迷惑的是在函數(類型)的定義中使用this,這個以後會講到,我們現在先舉個小例子:
functionmyType(){
this.name = "my type";
}
varo = newmyType();// 監視o可以看到o.name = "my type",此時this代表的是對象o
//然後我們直接調用myType(),作為一個函數調用
myType();//監視window.name可以發現window.name = "my type",此時this代表window對象
//然後我們清空window.name ,並通過caller調用myType
window.name = undeifned; //監視發現window.name = undeifined
varcaller = {};
myType.call(caller);// 監視caller.name = "my type", window.name = undefined
如果有對call或者apply不熟悉的,可以查看下相關資料,此處不做深入描述。上邊的例子我們大致可以看出,this在函數中真是代表什麼,簡而言之,就是調用者。直接在瀏覽器客戶端調用,通常表示window,通過call,apply調用,則代表指定的調用對象,而實例化上作為方法使用,它的調用者就是實例化出來的對象。
需要說明的是,在客戶端編程中,在事件或者setTimeInterval等中指定的obj.func,他們的調用者並不是obj,隻是指定瞭一個委托而已。我曾經遇到過這樣的問題,因此在這兒給說明下。