Объект jQuery неизменяем?

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

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

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

ОБНОВИТЬ:

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


person Daniel    schedule 16.11.2011    source источник
comment
Многие методы jQuery (не .append) возвращают новый объект jQuery из-за своей природы, вам нужен полный список всех этих методов или что-то в этом роде? Неважно, цепляете ли вы, важно то, что возвращают методы. $("div").append("something").bind( "click", fn ) возвращает тот же объект, в то время как $("div").parent() возвращает новый объект, а $("div").html() вообще не возвращает объект jQuery, а строку   -  person Esailija    schedule 16.11.2011
comment
@Esailija Мне не нужен список, я просто подумал, что если вы создадите цепочку и будет возвращен новый объект, это будет утечка памяти   -  person Daniel    schedule 16.11.2011
comment
Да, например, var a = $("div").parent() создаст 2 объекта, и хотя похоже, что ничто не ссылается на первый объект, и он будет удален сборщиком мусора, второй объект фактически ссылается на первый объект в своем свойстве .prevObject, поэтому в этой ситуации, если вы храните a где-то, вы никогда не избавитесь от первого объекта, даже если вы используете только второй.   -  person Esailija    schedule 16.11.2011


Ответы (7)


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

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

var obj1 = $("<p>foo</p>"),
    obj2 = $("<span>bar</span>").appendTo(obj1);
person Mathias Bynens    schedule 16.11.2011

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

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

console.log(obj1);
console.log(obj2);
person Abdul Munim    schedule 16.11.2011

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

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

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

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

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

console.log(obj1 == obj2) //true
person James Allardice    schedule 16.11.2011

http://jsfiddle.net/rLg9S/

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

person Adam Merrifield    schedule 16.11.2011
comment
Это не отвечает на вопрос. - person Tadeck; 16.11.2011
comment
obj1 не изменяется, но базовый элемент dom (obj1["0"]) изменяется. - person Esailija; 16.11.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 обычно должна означать, что объекты, с которыми вы закончили, не зависают в памяти.

person lonesomeday    schedule 16.11.2011

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

var obj2 = obj1.clone().append("something");
person Maxim Krizhanovsky    schedule 16.11.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);
person thecodeparadox    schedule 16.11.2011