Login / Sign Up


Enter site:
Login: 
Password: 


First time here?
 
Register [?]:
Registering allows you:
  • Purchase products from the product catalog and access them any time.
  • Ask questions to another specialists in IT
  • Publish your own Joomla extensions, soft or other products if you are developer or distributor
  • Add interesting weblinks and access them from any place
  • Watch the updates of the site and have special abilities that guests don't have
  • Watch the news of the service and new articles and get knowledge
Choose login:
Your Email:
Enter the result of operation (in digits):
13 + 2 = ? Update

Работа с объектами
jQuery метод extend() - объединяем объекты PDF Print E-mail
Written by Максим   
Friday, 07 December 2012 09:40
Liked:
4


Did not like: 2

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

 
Итак, начнём с того, что метод$.extend()в jQuery можно вызывать двумя способами.

Способ 1 - обычное объединение 

Данный способ доступен, начиная с версии 1.0 jQuery. В первом случае вызов метода выглядит так:
 
jQuery.extend( цель [, объект1] [, объектN] )
 
Параметры вызова:
  • цель- Объект, который получит новые свойства, если в вызове были переданы дополнительные объекты или тот, который расширит пространство имен jQuery, если он является первым и единственным аргументом.
  • объект1 - объект, содержащий дополнительные свойства, которые должны объединиться
  • objectN - дополнительные объекты, содержащие свойства для объединения

Когда мы передаём два и более объекта в$.extend(), то свойства из всех этих объектов копируется в объектцель

Если передаем только один аргумент в метод$.extend(), это неявно означает, что аргументцельпропущен, и в этом случае сам объект jQuery предполгается в качестве целевого. Делая так, мы можем добавлять новые функции в пространство имен jQuery. Этот подход может быть очень полезен для разработчиков плагинов, которые хотят добавлять новые методы в jQuery. 
 
Нужно иметь в виду, что целевой объект (первый аргумент) будет изменен, а также возвращен методом$.extend(). Если же мы хотим защитить два оригинальных объекта от изменений, мы можем это сделать, передав в качестве цели пустой объект, как показано в коде ниже:

var object1 = { price : 100 }; 

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

 
Итак, начнём с того, что метод$.extend()в jQuery можно вызывать двумя способами.

Способ 1 - обычное объединение 

Данный способ доступен, начиная с версии 1.0 jQuery. В первом случае вызов метода выглядит так:
 
jQuery.extend( цель [, объект1] [, объектN] )
 
Параметры вызова:
  • цель- Объект, который получит новые свойства, если в вызове были переданы дополнительные объекты или тот, который расширит пространство имен jQuery, если он является первым и единственным аргументом.
  • объект1 - объект, содержащий дополнительные свойства, которые должны объединиться
  • objectN - дополнительные объекты, содержащие свойства для объединения

Когда мы передаём два и более объекта в$.extend(), то свойства из всех этих объектов копируется в объектцель

Если передаем только один аргумент в метод$.extend(), это неявно означает, что аргументцельпропущен, и в этом случае сам объект jQuery предполгается в качестве целевого. Делая так, мы можем добавлять новые функции в пространство имен jQuery. Этот подход может быть очень полезен для разработчиков плагинов, которые хотят добавлять новые методы в jQuery. 
 
Нужно иметь в виду, что целевой объект (первый аргумент) будет изменен, а также возвращен методом$.extend(). Если же мы хотим защитить два оригинальных объекта от изменений, мы можем это сделать, передав в качестве цели пустой объект, как показано в коде ниже:

var object1 = { price : 100 };
var object2 = { available : 1 };
// объединяем object1 и object2
var object = $.extend({}, object1, object2);
// после вызова объекты object1 и object2
// не изменятся, а результат их объединения с
// пустым объектом {} запишется в результирующий объект object:
// object = { price : 100, available : 1 }

Объединение объектов, выполняемое методом$.extend()не является рекурсивным по умолчанию. Это значит, что если свойство первого объекта является само объектом или массивом, то оно будет полностью перезаписано свойством с таким же именем (ключом) во втором объекте. То есть значения не объединятся, а перезаписываются. Пример такого поведения демонстрируется в следующем отрывке кода:

// первый объект. внутренний объект properties будет перезаписан после
// вызова метода $.extend()
var product1 = { price : 100, properties : { width: 300, height : 50 } };
// второй объект
var product2 = { available : 1, properties: { deep: 40 } };

$.extend( product1, product2 );

// в результате выполнения объединения получим такой объект product1:
// product1 = { price : 100, available : 1, properties : { deep: 40 } }
// видим, что внутренний объект properties перезаписался на значение,
// содержавшееся внутри product2

А что делать, если мы хотим рекурсивно объединять объекты? Чтобы объекты и массивы, находящиеся в них также объединялись? Для этого и существует 2-й способ вызова.

Способ 2 - рекурсивное объединение

Этот вызов метода$.extend()доступен, начиная с версии 1.1.4 библиотеки jQuery и выглядит следующим образом:
 
jQuery.extend( [рекурсивно], цель, объект1 [, объектN] )
 
Параметры вызова:
  • рекурсивно - если этот признак установлен в true, то объединение становится рекурсивным (т.н. "глубокое копирование")
  • цель  - объект, который необходимо расширить новыми свойствами. Он будет получать все новые свойства
  • объект1 - объект, содержащий дополнительные свойства, которые должны объединиться
  • objectN - дополнительные объекты, содержащие свойства для объединения

Как видим, всё отличие второго способа от первого - это дополнительный параметррекурсивно. Если передавать true в качестве первого аргумента метода$.extend(), то объекты и массивы, вложенные во все объекты, передаваемые также в метод будут копироваться рекурсивно. Стоит сразу отметить, что передача false в качестве первого аргумента не поддерживается. Рассмотрим, как будет выглядеть наш предыдущий пример в случае использования "глубокого копирования" - всё, что мы поменяем - это добавим в качестве первого аргумента вызова значениеtrue:


// первый объект. внутренний объект properties сохранится после
// вызова метода $.extend() и объединится с одноименным объектом
// внутри product2
var product1 = { price : 100, properties : { width: 300, height : 50 } };
// второй объект. теперь он будет рекурсивно объединен с первым
var product2 = { available : 1, properties: { deep: 40 } };

// используем "глубокое копирование", передавая true
// в качестве первого аргумента метода $.extend()
$.extend( true, product1, product2 );

// в результате выполнения объединения получим такой объект product1:
// product1 = {
//  price: 100, available: 1, properties: { width: 300, height: 50, deep: 40 }
// }
// видим, что внутренний объект properties рекурсивно объединился
// из product1 и product2

 

Неопределенные, т.е. undefined-свойства, не копируются. Но свойства, заимствованные из прототипа объекта будут перезаписаны. Свойства, которые являются объектами, сконструированными черезnew MyCustomObject(args), или встроенные типы JavaScript, такие как Date или RegExp не пересоздаются и появятся как plain-объекты в результирующем объекте или массиве.
 
При "глубоком копировании" расширяются объекты и массивы. Но оболочки для примитивных типов, такие какString,BooleanиNumber- нет. Если есть нужды, которые выходят за рамки данного поведения работы метода$.extend(), то придется писать свою собственную реализацию метода.
 
Last Updated on Friday, 07 December 2012 11:25
 


Found Error?

Система Orphus

Site Statistics

Яндекс.Метрика

Our Pages


Allineed.Ru © 2009-2012 - Allineed.Ru - ответы на IT вопросы, статьи о разработке, IT и программном обеспечении. При использовании материалов сайта ссылка обязательна. Использование данного сайта и любой его части означает принятие условий Пользовательского Соглашения.
Allineed.Ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters. The Joomla! name and logo is used under a limited license granted by Open Source Matters the trademark holder in the United States and other countries.