клонирование объекта в Javascript с сохранением instanceof - PullRequest
1 голос
/ 21 декабря 2011

Я хочу клонировать объект в 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?

Ответы [ 4 ]

2 голосов
/ 21 декабря 2011

Как насчет этого:

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

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

cloneLoop = $.extend(new iPath(), loop);
1 голос
/ 21 декабря 2011

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

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

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

alert(cloneLoop instanceof iPath);
1 голос
/ 21 декабря 2011

Если вариант не поддерживает старые браузеры, вы можете использовать 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)

0 голосов
/ 21 декабря 2011

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

Что-то вроде:

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