Дублирование объекта javascript, а затем изменение его без изменения исходного экземпляра? - PullRequest
1 голос
/ 25 января 2012
Order.prototype.selectItem = function(newItem) { ...

newItem - это объект, который я хочу скопировать, а затем изменить копию без изменения оригинального newItem.

var newSelectedItem = newItem;
newSelectedItem.orderIndex = this.selectedItems.length + 1;

Изменение порядка индекса копии также изменит исходный новый элемент.

Вопрос: Как скопировать, а затем изменить копию без изменения оригинального newItem.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 25 января 2012

Создать новый объект

var newSelectedItem = {};

И скопировать все свойства из старого объекта в новый

for(var prop in newItem){
    if(newItem.hasOwnProperty(prop)){
        newSelectedItem[prop] = newItem[prop];
    }
}

Обратите внимание, что это решение работает только для плоских плоских объектов.Если «newItem» является экземпляром некоторого прототипа, вы не можете просто создать новый объект с {}, и если свойства могут содержать изменяемые массивы или объекты, то вам также необходимо сделать рекурсивное глубокое копирование.

Для дополнительных примеров, инструментарий dojo имеет несколько функций (mixin и clone) для таких вещей: http://trac.dojotoolkit.org/browser/dojo/dojo/trunk/_base/lang.js

1 голос
/ 25 января 2012

Если вы используете jQuery (который я бы посоветовал), вы можете клонировать объекты по этому сообщению Какой самый эффективный способ глубокого клонирования объекта в JavaScript?

0 голосов
/ 26 января 2012

Вам не обязательно клонировать объект. Если все, что вам нужно, это иметь объект, на который вы можете установить свойства, не изменяя оригинал, то так называемое «делегирование Boodman / Crockford » гораздо эффективнее. Желая, чтобы я опубликовал это, когда я впервые использовал его :) См. Также dojo.delegate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...