2011-11-16 6 views
11

Hola un nuevo novato en jQuery aquí y me preguntaba si los objetos jQuery son inmutables. Por ejemplo:jQuery objeto son inmutables?

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

Will obj1 y obj2 ser el mismo significado obj2 hará referencia a obj1?

ACTUALIZACIÓN:

El ejemplo anterior tipo de arañazos la superficie de lo que quiero saber, una pregunta más precisa es: Si i cadena de funciones de la API jQuery van a devolver el mismo objeto o una nueva (como en el caso de las cadenas en Java)?

+0

Muchos métodos jQuery (no .append) devuelven un nuevo objeto jQuery debido a su naturaleza, ¿necesita una lista compherensive de todos esos métodos o algo así? No importa si estás encadenando, lo que importa es qué devuelven los métodos. '$ (" div "). append (" algo "). bind (" click ", fn)' devuelve el mismo objeto mientras '$ (" div "). parent()' devuelve un nuevo objeto mientras '$ (" div "). html()' no devuelve ningún objeto jQuery, excepto la cadena – Esailija

+0

@Esailija No necesito una lista, solo pensaba que si encadena y se devolverá un nuevo objeto, entonces eso sería una pérdida de memoria – Daniel

+1

Sí, sería, por ejemplo 'var a = $ (" div "). parent()' creará 2 objetos y si bien parece que nada se refiere al primer objeto y será basura recolectada, el segundo objeto en realidad se refiere al primer objeto en su propiedad '.prevObject' por lo que, en esta situación, si almacena' a' en algún lugar, nunca se deshará del primer objeto aunque solo esté utilizando el segundo. – Esailija

Respuesta

1

http://jsfiddle.net/rLg9S/

Tanto objeto devolver el mismo elemento de modo que sí.

+1

Esto no responde la pregunta. – Tadeck

+1

'obj1' no se modifica, pero el elemento dom subyacente (' obj1 ["0"] ') es. – Esailija

3

Sí, es obj2 hará referencia a obj1. Lo que básicamente hace es append cualquiera que sea el dado a obj1 y devuelve la referencia.

Usted puede tratar de ver en console que obj1 y obj2 tener el texto "something"

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

Tanto obj1 y obj2 será una referencia al objeto jQuery que contiene el elemento <tag></tag>, sí.

Si desea mantener una referencia al segundo elemento, se puede utilizar en lugar .appendTo():

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

Suponiendo que he entendido su pregunta, sí, obj2 habrá una referencia al objeto almacenado en obj1 . Si haces algo a obj2:

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

podrás ver los cambios en obj1:

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

Usted puede confirmar esto adicionalmente, examinando los dos objetos de la igualdad:

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

Usted puede usar $.clone() si necesita una copia del objeto.

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` 

como:

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

Así, obj1 y obj2 se referirá lo mismo

prueba:

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

si una función cambios que son elementos en una selección, entonces sí, habrá un nuevo objeto creado.

Por ejemplo:

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

link es un objeto diferente a span. Sin embargo,, el objeto original en realidad no se pierde. Puede volver fácilmente a él con el método end, que básicamente revierte una operación de manipulación.

$('#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 

Así que si había un gran número de llamadas de selección encadenadas que no utilizó end, que podría terminar con un objeto muy grande (ya que no habría una cadena de objetos que hace referencia el objeto que hizo ellos). Sin embargo, este sería un diseño increíblemente incómodo, por lo que es poco probable que lo haga, mientras que la recolección de basura de Javascript generalmente significa que los objetos con los que ha terminado no se quedan en la memoria.

Cuestiones relacionadas