在之前javascript 定義函數的方法這篇日誌裡面有提到建構函式,現在,來具體的介紹以下javascript的建構函式及方法的概念。
這是兩個及其有用的概念,對後面介紹javascript的物件導向機制,及其類方法,繼承的頓悟有著說不清,道不明的好處,
仔細理解一下吧
建構函式:
在javascript中,使用new運算子或者預定義的建構函式(如Object(),Date(),Function()等)都可以建立並初始化一個新的js對象。
建構函式具有如下兩個特性,其本質仍然是javascript函數:
它由new運算子調用
傳遞給它的是一個對新建立的Null 物件的引用,將該引用作為關鍵字this的值,而且它還要對新建立的對象進行適當的初始化
//定義建構函式,
function User(name,age)
{
this.name = name;
this.age = age;
}
//執行個體化兩個對象
var simaopig = new User('simaopig','25');
var xiaoxiaozi = new User('xiaoxiaozi','25');
這裡需要明白並且強迫自己接受如下觀點:建構函式知識初始化了特定的對象,但是其並不返回這個對象
在上例中,我們可以看到建構函式對this的引用,其只是初始化由this傳遞進來的對象,並且啥也不返回。
方法:
所謂方法(method),其實就是通過對象調用的javascript函數
其實函數又是什嗎?函數與方法又有啥不同?這似乎是一個哲學概念?雞是什嗎?那就是蛋啊。。
函數其實就是數值,其和方法沒有任何本質區別,之所以要交兩個名字,無非是要強調對象的作用罷了。
因為你完全可以把函數賦值給任何變數,當然也就包括了對象的屬性。
//執行個體化對象o
var o = new Object();
//把函數fun賦值給o的屬性method
o.method = fun;
//聲明函數fun
function fun()
{
return '250';
}
//調用o的屬性,效果同學們自己去查看,又是彈窗,值為250
alert(o.method());
方法有個非常重要的屬性,即在方法主體內部,關鍵字this的值為調用該方法的對象。
任何被用作方法的函數都會得到一個額外的實際參數,就是調用該函數方法的對象,也就是剛才我告訴你的this。
我為啥說函數其實就是方法,方法也就是函數呢?
函數是儲存在變數中的值,而那個變數也不過是全域對象的一個屬性,因此,當你調用一個函數是,其實就是在調用全域對象的一個方法。
但是,函數和方法真正的不同點就在於設計和目的上,方法是用來對this對象進行操作的,而函數通常是獨立的並不需要this對象。
本來寫到這裡就不想再說啥了,不過,如果不把這個例子抄下來,難免真正需要的人就有些發暈,尤其當看我下一篇日誌的時候。。
所以,抄。
//定義建構函式 矩形,有倆屬性,寬和高
function Rectangle(w, h)
{
this.width = w;
this.height = h;
}
//定義一個方法,計算面積,這裡用了this哦
function compute_area()
{
return this.width * this.height;
}
//實力化對象rect
var rect = new Rectangle(3,4);
//通過給屬性賦值把函數 compute_area作為rect對象的一個屬性
rect.area = compute_area;
//如下內容調用新的方法獲得面積 結果為3 * 4
var are = rect.area();
上述代碼有個問題,就是我每次調用rect對象的方法前,總得將方法賦值給其的一個屬性。
那我新執行個體化的對象,比如rect2要想求得面積,還得這樣來上一遍。麻煩啊。
那如果我直接在建構函式裡面聲明呢?為所用執行個體化的對象都聲明一個方法,是不是可以解決問題?
NO,雖然你很聰明,因為