2011-09-13 51 views
5
function Set() {   // This is the constructor 
    this.values = {};  
    this.n = 0;   
    this.add.apply(this, arguments); // All arguments are values to add 
} 

// Add each of the arguments to the set. 
Set.prototype.add = function() { 
    /* Code to add properties to the object's values property */ 
    return this; 
}; 

這是「Javascript:The權威指南」中用於創建「Set」類的代碼的開始。我試圖在構造函數中合理化apply()函數的必要性,但無法想象出我的生活。爲什麼構造函數中需要apply()函數

this.add.apply(this, arguments); 

如果add()功能已經是一個被「this」又是什麼目的或用途調用的方法是核心apply()功能實現。在此先感謝任何人誰試圖解釋這個給我

http://jsfiddle.net/Marlin/Ydwgv/ - 從Javascript完整的例子:權威指南

+0

它似乎沒有什麼用處。我有*從未*見過它...... – Blender

+0

你對傳遞參數對象的事實有何想法? – ChaosPandion

+0

你不認爲它可能與確保add()不作爲實例的屬性而不是原型添加有關?我明白這不是正在宣佈......但它肯定令我困惑 – Marlin

回答

7

「如果add()函數已經是由‘這個’,然後調用的方法有什麼目的或用途的核心應用()函數實現。

從而使arguments可以作爲一個完整的集合來傳遞。如果Set接受無限數量的參數,則此參數有用。

+0

好的,讓我看看我是否有這個。 add()接受無限的參數,但不接受集合。通過使用apply()你可以繞過這個限制嗎? – Marlin

+0

@Marlin粗略地說,是的;-)推測,'add'主體遍歷'arguments'對象,並對每個元素(每個元素表示該函數被調用的參數)執行一些操作。 – 2011-09-13 04:22:03

+0

@Marlin:是的,使用'.apply()',無論將多少個單獨的參數傳遞給'Set()',它們都會作爲單獨的參數傳遞給'.add()'。 – user113716

2

這是不需要在構造函數 - 事實上,它有無關的一般構造函數(但顯然它對這個特定的問題;-)。 apply確實做的是確保目標函數被「正確」調用。

即,apply,給定的類似陣列的對象*(arguments計數),[n1, n2, ... n3]和功能f時,它將調用目標函數作爲f(n1, n2, ... n3)apply也採用在代碼中傳遞新創建對象的「this context」(使其看起來好像add被稱爲「常規方法」)。有關更多信息,請參閱上面的鏈接。

這意味着,對於上述代碼中,

var s = new Set(1, 2, 3) 

var s = new Set() 
s.add(1, 2, 3) 

是等價的。

快樂編碼。


*在FireFox之前,它必須是一個數組本身。這就是爲什麼有時候代碼使用醜陋成語:

f.apply(context, Array.prototype.slice.call(arguments, 0)) 
1

我相信,它被稱爲不適合的範圍,但適用的事實,將採取的參數數組,並通過他們依次是:

this.add.apply(this, [1,2,3,4]); 
.... 
function add(one, two, three, four) 

沒有一個參數是一個數組

+0

完美,我很欣賞 – Marlin

1

函數的apply方法允許您通過傳遞一個數組而不是項目列表來調用該函數。

舉例說明:

function add(a, b) { 
    return a+b; 
} 

var values = [1,2]; 

alert(add.apply(this, values)); 

會提醒3.


所以,基本上,你在做什麼有讓您的構造方法來任意數量的參數,會讓你然後一次性將它們全部傳遞給add函數。

所以,如果你打電話給你的構造函數:

var stack = new Set(1,2,3,4,5,6,7,8,9); 

所有這些值將被傳遞給add功能,因爲如果你會寫:

this.add(1,2,3,4,5,6,7,8,9); 
+0

的快速反應,這正是我需要知道的。在前幾天學會了應用,認爲它只是用來調用來自不同對象的方法 – Marlin

1

使用.apply()語法允許您將一個參數數組傳遞給被調用的函數。在這種情況下,它將傳遞arguments對象,這意味着它將調用add()以及傳遞給Set構造函數的所有參數。所以,你可以說,例如創建值任意數量的新集對象,

var mySet = new Set(13,42,18,19,44,11,5); 

而所有這些數值將傳遞到add()

+0

謝謝,我之前的apply的read包含了這個解釋,但更多地關注它從不同對象調用方法的能力 – Marlin

相關問題