2011-11-16 55 views
11

你好jQuery上的新noob在這裏,我想知道如果jQuery對象是不可變的。 例如:jQuery對象是不可變的?

var obj1 = $("<tag></tag>"); 
var obj2 = obj1.append("something"); 

將OBJ1和OBJ2相同的含義OBJ 2將引用OBJ1?

UPDATE:

上面的例子那種劃痕什麼的,我想知道在表面,更準確的問題是:如果我從jQuery API連鎖功能將它們返回相同的對象或一個新的(就像Java中的字符串一樣)?

+0

許多jQuery方法(不是.append)由於它們的性質而返回一個新的jQuery對象,您是否需要所有這些方法的全面列表或其他?你是否鏈接並不重要,重要的是這些方法返回。 '(「div」)。append(「something」)。bind(「click」,fn)'返回同一個對象,而$(「div」)。parent()'返回一個新對象,'$(「 div「)。html()'根本不返回一個jQuery對象,但字符串 – Esailija

+0

@Esailija我不需要一個列表,我只是想,如果你鏈和一個新的對象將被返回,那將是一個內存泄漏 – Daniel

+1

是的,例如'var a = $(「div」)。parent()'將創建2個對象,雖然看起來沒有任何東西引用第一個對象,並且它將被垃圾收集,但第二個對象實際上指的是它的'.prevObject'屬性中的第一個對象,因此,在這種情況下,如果將'a'存儲在某個地方,即使只使用第二個對象,也不會擺脫第一個對象。 – Esailija

回答

1

http://jsfiddle.net/rLg9S/

兩個對象返回相同的元素,以便肯定。

+1

這不回答這個問題。 – Tadeck

+1

'obj1'沒有被修改,但底層的dom元素('obj1 [「0」]')是。 – Esailija

3

是的,它obj2將參考obj1。它基本上做的是append無論給予obj1什麼,並返回參考。

您可以嘗試在console眼看obj1obj2具有文本"something"

console.log(obj1); 
console.log(obj2); 
6

兩個obj1obj2將含有<tag></tag>元素jQuery對象的引用,是的。

如果你想保持到第二元素的引用,你可以使用.appendTo()代替:

var obj1 = $("<p>foo</p>"), 
    obj2 = $("<span>bar</span>").appendTo(obj1); 
3

假設我理解你的問題,是的,obj2將存儲在obj1的對象的引用。如果你做一些事情來obj2

obj2.attr("id", "example"); 

您將看到obj1的變化:

console.log(obj1 == obj2) //true 
0

您:

console.log(obj1) //Will show <tag id="example">something</tag> 

您可以通過測試兩個對象是否相等進一步證實了這一點如果需要複製對象,可以使用$.clone()

var obj2 = obj1.clone().append("something"); 
0
var obj1 = $("<p></p>"); 
var obj2 = obj1.append("something"); // in this is you just assign the `obj1` object to `obj2` 

,如:

var x = 5; 
var y = x; //here, both x and y are 5 

所以,obj1obj2將把同樣的事情

證明:

console.log(obj1 === obj2); 
1

如果一個函數改變哪些元素在選擇中,那麼是的,將會創建一個新的對象。

例如:

var link = $('#myLink'), 
    span = link.find('span'); 

link是一個不同的目的是span但是,原來的對象實際上並沒有丟失。您可以使用end方法輕鬆回到該方法,該方法基本上可以回滾操作操作。

$('#myLink') 
    .find('span') // get the span elements 
     .css('color', '#fff') // modify them 
    .end() // go back to the original selection 
    .css('font-size', '24px'); // modify that 

所以,如果你有一個非常大的數字鏈接的選擇調用未使用end,你可以結束了一個非常大的對象(因爲會有對象鏈是引用了製造的物體他們)。然而,這是非常尷尬的設計,所以你不太可能這樣做,而Javascript的垃圾收集通常意味着你已經完成的對象不會在內存中閒逛。