Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.06.2015, 23:48
Кандидат Javascript-наук
Отправить личное сообщение для Casufi Посмотреть профиль Найти все сообщения от Casufi
 
Регистрация: 05.02.2010
Сообщений: 109

Клонирование объекта в javascript
В яваскрипте объекты передаются по ссылке. Возникла необходимость в клонировании объектов. Вопрос, есть ли подводные камни у подхода, реализованного ниже ?

function cloneObject(obj) {
    var clone = {};
    for (var i in obj) {
        if (typeof (obj[i]) == "object" && obj[i] != null) clone[i] = cloneObject(obj[i]);
        else clone[i] = obj[i];
    }
    return clone;
}


http://jsfiddle.net/0vnzxh94/1/
Ответить с цитированием
  #2 (permalink)  
Старый 29.06.2015, 01:23
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Попытаемся клонировать HTML-элемент, а потом подключить его к DOM:
document.body.appendChild(clone(document.createElement('input')));

Произошла ошибка: TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
После клонирования наш элемент стал «просто» объектом.

Такая же ситуация с...
...числами и строками: clone(5) + clone(6) оказывается равным "[object Object][object Object]", а не 11
clone("OMG").toLowerCase() ==> TypeError: clone(...).toLowerCase is not a function

...массивами: clone([1,2]).push(3) ==> TypeError: clone(...).push is not a function

Для того, чтобы создать клон объекта, нам надо знать кто был его конструктором. При помощи этого можно создать «точную» копию объета. Т. е. клоном массива будет массив, а не «просто» объект. Правда такой трюк не срабатывает с HTML-элементом(TypeError: Illegal constructor). Но в таком случае можно использовать cloneNode.

Учитывая всё выше сказанное можно составить такую функцию
function clone(object) {
  if(object && typeof object === "object" && object !== null && object.nodeType === 1 && typeof object.nodeName==="string") {
    return object.cloneNode(false);
  }

  return new (object.constructor)(object);
}
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача координат объекта из 1С в JavaScript Kuklachel Events/DOM/Window 1 03.06.2013 18:56
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
Как в JavaScript присвоить функцию свойству объекта? kokon Общие вопросы Javascript 5 25.05.2010 22:11
Возможна ли смена типа созданного объекта в Javascript? phprus Общие вопросы Javascript 9 04.07.2009 02:41