Странная работа $.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' |
Потому, что $.extend возвращает новый объединённый объект. А у тебя он возвращает его в никуда.
|
И что? Он должен изменять первый объект, см. пример 2 http://api.jquery.com/jQuery.extend/
|
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' |
Цитата:
да, копируется в объект, переданный первым аргументом. <script src="http://code.jquery.com/jquery-1.8.2.js"></script> <script> alert($.extend); </script> Цитата:
всё нормально 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> |
Ух, вычислил бяку, но не могу понять отчего так. Вот пример: http://jsfiddle.net/tamtakoe/8fbAH/12/
Видно что $.extend, в отличие от обычного присваивания перезаписывает объект с которым не имеет связи. У кого-нибудь есть объяснения? |
var t = $.fn.test.defaults - t ссылается на defaults
t = {opt1: 'z'} - t теряет ссылку на defaults и ссылается на новый объект, defaults останится без изменений Как-то так :blink: |
А как отвязать t от $.fn.test.defaults? Нужно чтобы в t были значения, а не ссылка на объект
|
Переменные это ссылки на объекты. Попробуйте описать задачу по другому, может будет другое решение
|
Как по-другому-то? Задача: дополнить дефолтными настройками объекты, не меняя при этом дефолтные настройки.
Конечно, это можно сделать так: t = $.extend({}, t, {opt1: 'a'}), но получается масло-масленое |
var t = $.extend({}, $.fn.test.defaults); $.extend(t, {opt1: 'a'}) |
Два раза $.extend это масло масляное масляное) Еще и работать будет медленнее. Просто думал, что раз $.extend позволяет обновлять объект внутри себя (с параметром true), то почему бы не воспользоваться...
|
Часовой пояс GMT +3, время: 10:31. |