jQuery объект неизменен? - PullRequest
       55

jQuery объект неизменен?

11 голосов
/ 16 ноября 2011

Здравствуйте, новый noob на jQuery, и мне было интересно, являются ли объекты jQuery неизменными.Например:

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

Будет ли obj1 и obj2 иметь одно и то же значение, что obj2 будет ссылаться на obj1?

ОБНОВЛЕНИЕ:

Приведенный выше пример царапает поверхность того, что я хочу знать, более точный вопрос: если я цепная функция из API jQuery, они возвратят тот же объектновый (как в случае со строками в Java)?

Ответы [ 7 ]

6 голосов
/ 16 ноября 2011

И obj1, и obj2 будут ссылками на объект jQuery, содержащий элемент <tag></tag>, да.

Если вы хотите сохранить ссылку на второй элемент, вы можете использовать .appendTo() вместо:

var obj1 = $("<p>foo</p>"),
    obj2 = $("<span>bar</span>").appendTo(obj1);
3 голосов
/ 16 ноября 2011

Если я понял ваш вопрос, да, obj2 будет ссылкой на объект, сохраненный в obj1. Если вы что-то делаете для obj2:

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

Вы увидите изменения в obj1:

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

Вы можете подтвердить это далее, проверив два объекта на равенство:

console.log(obj1 == obj2) //true
3 голосов
/ 16 ноября 2011

Да, это obj2 будет ссылаться на obj1.То, что он в основном делает, это append независимо от того, что дано obj1 и возвращает ссылку.

Вы можете попытаться увидеть на console, что obj1 и obj2 с текстом "something"

console.log(obj1);
console.log(obj2);
1 голос
/ 16 ноября 2011

Если функция изменяет, какие элементы находятся в выделении, то да, будет создан новый объект.

Например:

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 обычно должна означать, что объекты, с которыми вы работали, не остаются в памяти.

1 голос
/ 16 ноября 2011

http://jsfiddle.net/rLg9S/

Оба объекта возвращают один и тот же элемент, поэтому да.

0 голосов
/ 16 ноября 2011
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

Итак, obj1 и obj2 будут означать одно и то же

доказательство:

console.log(obj1 === obj2);
0 голосов
/ 16 ноября 2011

Вы можете использовать $. Clone () , если вам нужна копия объекта.

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