Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Странная работа $.extend (https://javascript.ru/forum/jquery/32684-strannaya-rabota-%24-extend.html)

Shitbox2 25.10.2012 14:34

Странная работа $.extend
 
Почему-то $.extend не может поменять данные в объекте, хотя обычным присваиванием все меняется. В чем может быть дело?
$('#item').data('options',{opt1:'a'})
newoptions = {opt1:'b', opt2:'b'}

$.extend(true, $('#item').data().options, newoptions)
console.log($('#item').data('options')) //{opt1:'a'}

$item.data().options = 'abc'
console.log($('#item').data('options'))// 'abc'

Skipp 25.10.2012 14:58

Потому, что $.extend возвращает новый объединённый объект. А у тебя он возвращает его в никуда.

Shitbox2 25.10.2012 16:10

И что? Он должен изменять первый объект, см. пример 2 http://api.jquery.com/jQuery.extend/

Hoshinokoe 25.10.2012 17:35

Shitbox2,

Какая версия jquery ?

Проверил на jquery 1.8.2 в Firefox - все ок.
$('#item').data('options',{opt1:'a'});
newoptions = {opt1:'b', opt2:'b'};

$.extend(true, $('#item').data().options, newoptions);
console.log($('#item').data('options')); // {opt1: 'b', opt2: 'b'}

$('#item').data().options = 'abc';
console.log($('#item').data('options'));// 'abc'

melky 25.10.2012 18:15

Цитата:

Сообщение от Shitbox2 (Сообщение 212248)
И что? Он должен изменять первый объект, см. пример 2 http://api.jquery.com/jQuery.extend/

легче посмотреть исходный код.

да, копируется в объект, переданный первым аргументом.

<script src="http://code.jquery.com/jquery-1.8.2.js"></script>
<script>
alert($.extend); 
</script>


Цитата:

Сообщение от Shitbox2
Почему-то $.extend не может поменять данные в объекте, хотя обычным присваиванием все меняется. В чем может быть дело?

луна может быть в неправильной фазе.

всё нормально extend'ится.
<script src="http://code.jquery.com/jquery-1.8.2.js"></script>

<div id="item"></div>

<script>

$('#item').data('options',{opt1:'a'})

newoptions = {opt1:'b', opt2:'b'};

$.extend(true, $('#item').data().options, newoptions)

alert( $("#item").data().options.opt2 );

</script>

Shitbox2 26.10.2012 16:33

Ух, вычислил бяку, но не могу понять отчего так. Вот пример: http://jsfiddle.net/tamtakoe/8fbAH/12/
Видно что $.extend, в отличие от обычного присваивания перезаписывает объект с которым не имеет связи. У кого-нибудь есть объяснения?

zebra 26.10.2012 16:41

var t = $.fn.test.defaults - t ссылается на defaults
t = {opt1: 'z'} - t теряет ссылку на defaults и ссылается на новый объект, defaults останится без изменений
Как-то так :blink:

Shitbox2 26.10.2012 16:44

А как отвязать t от $.fn.test.defaults? Нужно чтобы в t были значения, а не ссылка на объект

zebra 26.10.2012 16:50

Переменные это ссылки на объекты. Попробуйте описать задачу по другому, может будет другое решение

Shitbox2 26.10.2012 17:05

Как по-другому-то? Задача: дополнить дефолтными настройками объекты, не меняя при этом дефолтные настройки.
Конечно, это можно сделать так:
t = $.extend({}, t, {opt1: 'a'}), но получается масло-масленое

zebra 26.10.2012 17:15

var t = $.extend({}, $.fn.test.defaults);
$.extend(t, {opt1: 'a'})

Shitbox2 26.10.2012 17:20

Два раза $.extend это масло масляное масляное) Еще и работать будет медленнее. Просто думал, что раз $.extend позволяет обновлять объект внутри себя (с параметром true), то почему бы не воспользоваться...


Часовой пояс GMT +3, время: 10:31.