2011-12-21 5 views
1

Я хочу клонировать объект в Javascript. У меня есть:клонирование объекта в Javascript, поддерживающий экземпляр

iPath = function() { this.heading = 0; this.path = []; }; 
loop = new iPath(); 

Я знаю, что с JQuery я могу сделать что-то вроде:

cloneLoop = $.extend(true, {}, loop); 

но чем

assert(cloneLoop instanceof iPath, "fails because loop is not an iPath"); 

Как я могу сделать глубокий клон удовлетворяющего последнее утверждение Assert?

+0

Расширение «глубокое» означает, что под-объекты также будут объединены. 'extend' не клонирует объект, он также не сохраняет цепочку прототипов. – zzzzBov

ответ

2

Как об этом:

cloneLoop = $.extend(true, new iPath(), loop); 

... хотя я не уверен, если вы хотите сделать глубокую копию. Я думаю, что это было бы лучше:

cloneLoop = $.extend(new iPath(), loop); 
+0

+1 красиво сделано, и должно работать на всех браузерах. –

1

Если не поддерживает старые браузеры вариант, вы должны быть в состоянии использовать Object.create:

var cloneLoop = Object.create(loop); 

Вот демо

function Foo() { 
     this.x = 1; 
     this.y = 1; 
     this.blah = { f: "a", g: "b" }; 
    } 

    var f = new Foo(); 
    var clone = Object.create(f); 

    alert(clone instanceof Foo); 
    alert(clone.blah.f); 

предупреждения true, затем a (по крайней мере, в Chrome старые браузеры не поддерживают Object.create)

+1

+1 Кажется, что установить его как прототип объекта было бы хорошим решением. Для старых браузеров вы можете использовать типичный патч Object.create. 'function create (proto) {function f() {} f.prototype = proto; return new f; } ' –

0

Вам нужно написать свой собственный clone метод:

Что-то вдоль линий:

iPath.prototype = { 
    clone: function() { 
    var p; 
    p = new iPath(); 
    $.extend(true, p, this); 
    return p; 
    } 
} 
cloneLoop = loop.clone(); 
1

Продлить просто копирует свойства одного объекта к другому. Поэтому вам нужно начать с оригинальной копии объекта, который вы хотите скопировать. Поэтому используйте new iPath() вместо {}.

var iPath = function() { this.heading = 0; this.path = []; }; 
loop = new iPath(); 

cloneLoop = $.extend(true, new iPath(), loop); 

alert(cloneLoop instanceof iPath); 
Смежные вопросы