this
物件:函數物件被執行時所指定的綁定物件,也就是Function.prototype.call()
或Function.prototype.apply()
的第一個參數。
apply()
和 call()
幾乎一樣,差別只在於參數的形式不同:call()
接受一連串獨立的參數。apply()
接受一組陣列形式的參數。apply()
來示範。apply()
/ call()
和上一節介紹的 bind()
非常相似,都是對函數物件做綁定物件的指定,使用的語法形式也很像。bind()
和 apply()
/ call()
的差別在於:bind()
會建立一個新的函數物件 B,為 B 綁定一個特定物件,然後回傳 B 物件本身。B 會繼承了 A 的原型。bind()
綁定過,B 也會繼承相同的綁定物件,無法再綁新的 (前面 4.3 的範例)。apply()
/ call()
會執行函數物件 A,指派一個物件作為 this
,然後回傳函數 A 的執行結果。bind()
綁定過,用 apply()
/ call()
再指派其他的物件也沒用。whatsThis
, getFullName
) 去呼叫 apply()
,第一個參數就是函數裡的 this
。bind()
方便。bind()
就像海誓山盟,一個函數物件只要曾經和某個物件進行綁定就會死心踏地,即使再進行二次 bind()
或利用 apply()
指派一次性的綁定物件,都不會生效。getFullName()
這個函數物件本身沒有綁定過任何物件。introIronMan()
是透過 getFullName()
產生的新函數物件,綁定了 ironMan
。introClone()
是透過 introIronMan()
產生的新函數物件,雖然語法沒有指定新的綁定物件,但透過繼承,同樣綁定了 ironMan
。introSpiderMan()
是透過 introIronMan()
產生的新函數物件,雖然語法指定了新的綁定物件 spiderMan
,但由於繼承了 introIronMan()
的綁定關係,因此綁定物件同樣是 ironMan
。introClone()
和 introSpiderMan()
因為本身函數物件已經存在綁定了 ironMan
的關係,即使透過 apply()
指派新的物件,執行時函數內的 this
永遠仍是 ironMan
。getFullName()
因為沒有存在任何綁定關係,因此透過 apply()
,可以成功將函數內的 this
指派為 spiderMan
。this
指向 new
所產生的新物件this
物件:new
所產生的新物件。
new
關鍵字來產生一個物件,該物件會形成自己的環境 (Context),例如以下範例:this.exp
變成新物件 h
的屬性。