Показать сообщение отдельно
  #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);
}
Ответить с цитированием