標籤:2.3 name 使用 length 訪問 字串 調用 nbsp 實現
4.2.3 Function
函數是一種特殊的資料類型,它實際上是一種對象。
4.2.3.3 call( )和apply( )
1.在JavaScript中,每個函數都有call()和apply()兩個方法。
這兩個方法的兩個功能:
(1)用他們來觸發函數,並指定相關的調用參數。(2)他可以讓一個對象去“借用“另一個對象的方法,並為已所用。這也是非常簡單而實用的代碼重用。
2.通過一個例子來講解call
(1)定義一個some_obj對象,該對象有一個say()方法:
var some_obj={ name: ‘peichunyan‘, say: function(who){ return ‘Haya‘ + who + ‘, I am ‘ + this.name; }};
這樣,就可以調用該對象的say( )方法了,並在其中使用this.name來訪問其name屬性了:
some_obj.say( ‘Kitty‘); //輸出:Haya Kitty, I am peichunyan
(2)下面,我們再建立一個my_obj對象,它只有一個name屬性:
var my_obj={ name: ‘LiYundi‘};
(3)對於my_obj,也想擁有和some_obj的say( )方法相同功能的方法,因此,我們希望將該方法當做my_obj自身的方法來調用(沒必要自己再重複實現一遍)。在這樣情況下,我們就可以試試say( )函數中的對象方法call( ):
some_obj.say.call(my_obj, ‘Yanglan‘);//輸出: "Haya Yanglan, I am LiYundi "
(4)解釋:由於我們在調用say( )函數的對象方法call時傳遞了兩個參數:對象my_obj和字串"Yanglan”.這樣一來,當say( )被調用時,其中的this就被自動化佈建成了my_obj對象的引用。因此我們看到,this.name返回的不再是“peichunyan”,而是“LiYundi”了。
(5)如果我們調用call方法時,需要傳遞更多的參數,可以在後面依次加入它們:
some_obj.someMethod.call(my_obj, ‘a‘, ‘b‘, ‘c‘);
- apply( )
apply( )的工作方式與call( )基本相同,唯一的不同之處在於參數的傳遞形式,這裡目標函數所需要的參數都是通過一個數組來傳遞。所以,下面兩行代碼的作用是等效的:
some_obj.someMethod.call(my_obj, ‘a‘, ‘b‘, ‘c‘);some_obj.someMethod.apply(my_obj, [‘a‘, ‘b‘, ‘c‘]);
所以,對於之前的樣本,也可以這樣寫:
some_obj.say.apply(my_obj, [ ‘Yanglan‘]);//輸出: "Haya Yanglan, I am LiYundi "
4.2.3.4重新認識arguments對象
1.可以在一個函數中通過arguments來訪問傳遞給該函數所需的全部參數。栗子:
function f( ){ return arguments;}f(1,2,3); //[1,2,3]
2.儘管arguments看上去像是一個數組,但它實際上是一個類似數組的對象。它和數組相似是因為其中也包含了索引元素和length屬性。但相似之處也就到此為止了,因為arguments不提供一些像sort()、slice()這樣的數組方法。
- 但我們可以把arguments轉換成數組,這樣就可以對它使用各種各樣的數組方法了。
例子:
function f( ){ var args = [].slice.call( arguments); return args.reverse( );}f(1,2,3,4); //[4,3,2,1]
這裡的做法是:建立一個空數組,再使用它的slice屬性。也可以用Array.prototype.slice來調用同一個函數。
4.2.3.5 推斷物件類型
(1)問題:既然數組的typeof傳回值也是“object”,那麼要如何區分對象和數組呢?
(2)答案:使用Object對象的toString()方法。這個方法會返回所建立對象的內部類名。
(3)例:
Object.prototype.toString.call( { } ); // [object Object]Object.prototype.toString.call( [ ] ); // [object Array]
在這裡,toString()方法必須要來自於Object構造器的prototype屬性。直接調用Array的toString()方法是不行的,因為在Array對象裡,這個方法已經出於其它目的被重寫了。
[1, 2, 3].toString( );
《JavaScript物件導向編程指南》讀書筆記—Function