Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.10.2012, 14:34
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Странная работа $.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'
Ответить с цитированием
  #2 (permalink)  
Старый 25.10.2012, 14:58
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Потому, что $.extend возвращает новый объединённый объект. А у тебя он возвращает его в никуда.
__________________
.
Ответить с цитированием
  #3 (permalink)  
Старый 25.10.2012, 16:10
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

И что? Он должен изменять первый объект, см. пример 2 http://api.jquery.com/jQuery.extend/
Ответить с цитированием
  #4 (permalink)  
Старый 25.10.2012, 17:35
Профессор
Отправить личное сообщение для Hoshinokoe Посмотреть профиль Найти все сообщения от Hoshinokoe
 
Регистрация: 08.01.2012
Сообщений: 253

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'
Ответить с цитированием
  #5 (permalink)  
Старый 25.10.2012, 18:15
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Shitbox2 Посмотреть сообщение
И что? Он должен изменять первый объект, см. пример 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>
Ответить с цитированием
  #6 (permalink)  
Старый 26.10.2012, 16:33
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Ух, вычислил бяку, но не могу понять отчего так. Вот пример: http://jsfiddle.net/tamtakoe/8fbAH/12/
Видно что $.extend, в отличие от обычного присваивания перезаписывает объект с которым не имеет связи. У кого-нибудь есть объяснения?
Ответить с цитированием
  #7 (permalink)  
Старый 26.10.2012, 16:41
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

var t = $.fn.test.defaults - t ссылается на defaults
t = {opt1: 'z'} - t теряет ссылку на defaults и ссылается на новый объект, defaults останится без изменений
Как-то так
Ответить с цитированием
  #8 (permalink)  
Старый 26.10.2012, 16:44
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

А как отвязать t от $.fn.test.defaults? Нужно чтобы в t были значения, а не ссылка на объект
Ответить с цитированием
  #9 (permalink)  
Старый 26.10.2012, 16:50
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

Переменные это ссылки на объекты. Попробуйте описать задачу по другому, может будет другое решение
Ответить с цитированием
  #10 (permalink)  
Старый 26.10.2012, 17:05
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищем разработчиков nodejs\php - работа в Киеве onetwotrip Работа 0 08.10.2012 18:06
Javascript фронтенд разработчик(долгосрочная, удаленная работа) cpp Работа 11 16.09.2012 12:04
Программист JavaScript постоянная удалённая работа. moisha Работа 4 26.10.2011 19:52
Постоянная работа / Front-end / Москва kooper Работа 4 29.09.2011 22:06
Странная работа в Хроме и Сафари Flake jQuery 1 08.09.2010 10:28