jQuery对象是不可变的?

问题描述:

你好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

http://jsfiddle.net/rLg9S/

两个对象返回相同的元素,以便肯定。

+1

这不回答这个问题。 – Tadeck

+1

'obj1'没有被修改,但底层的dom元素('obj1 [“0”]')是。 – Esailija

是的,它obj2将参考obj1。它基本上做的是append无论给予obj1什么,并返回参考。

您可以尝试在console眼看obj1obj2具有文本"something"

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

两个obj1obj2将含有<tag></tag>元素jQuery对象的引用,是的。

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

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

假设我理解你的问题,是的,obj2将存储在obj1的对象的引用。如果你做一些事情来obj2

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

您将看到obj1的变化:

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

您:

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

您可以通过测试两个对象是否相等进一步证实了这一点如果需要复制对象,可以使用$.clone()

var obj2 = obj1.clone().append("something"); 

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); 

如果一个函数改变哪些元素在选择中,那么是的,将会创建一个新的对象。

例如:

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的垃圾收集通常意味着你已经完成的对象不会在内存中闲逛。