2015-12-23 1 views
0

Извините за плохой титул.jquery хранит объект в данных как ссылку, почему?

Пожалуйста, смотрите следующую скрипку:

https://jsfiddle.net/pw9e0yun/2/

$(this).data("item", "item-no-" + (index)); 
$(this).data("options", options); /* how to store options not as a reference */ 

мне нравится, как данные "пункт" хранится ("как есть"). Но мне не нравится, как хранятся данные «параметры». Это затруднило время для выяснения последних двух часов. Теперь я понимаю, что опция хранится как вид ссылки. Почему это и как я могу легко сохранить значения «в то время» объекта options в данных элемента.

Спасибо за разъяснения.

(кстати: ошибка «Ссылка на jsfiddle.net должен сопровождаться кодом» глупо)

ответ

1

Он хранит его в качестве ссылки, потому что это, как объекты и ссылки на них работают в JavaScript. data пишет в область хранения, которая в основном является объектом JavaScript, к которому вы добавляете свойства. (Это не так, как некоторые думают, напишите data-* атрибутов. Это делает инициализацию хранилища данных от них, что иногда удивляет человек.)

Если вы хотите сохранить копию объекта, вы должны скопируйте его. Существует множество способов копирования объектов в JavaScript (включая собственный jQuery $.extend). Какой из них вы используете, полностью зависит от вашей конечной цели.

Так это мощь работы, в зависимости от того, что options является и то, что ваша конечная цель:

$(this).data("options", $.extend({}, options)); 
// or 
$(this).data("options", $.extend(true, {}, options)); 
+0

Спасибо за пояснения. Хотя известно, хорошо иметь такое очень четкое различие между 'data' и' data- * '. Оба ваших решения работали для меня. Я пишу/расширяю плагин табуляции. Я хотел сохранить параметры для элементов, которые выполняет итератор. Все прошло нормально, пока параметры были статичными. Но затем я добавил индекс (число) к параметрам для последующего использования. Вот когда все сломалось. – agoldev

Смежные вопросы