2014-04-06 4 views
0

Так что моя проблема проста, но я не могу ее исправить. У меня есть 2 объекта, один временная и второй один является постоянным, временный объект принимает данные от постоянного, но когда я выполнять действия на временном, постоянный объект Chaing тоже пример:Временный объект и объект Permament Javascript

var permObject = { 
    data1: 1, 
    data2: 4, 
} 
tmpObject = permObject 
tmpObject.data2 -= tmpObject.data1; 
console.log(tmpObject.data2); //data2 = 3 
console.log(permObject.data2); //data2 = 3 

Так что мой вопрос, как может я беру данные из постоянного объекта во временный объект, но когда я делаю действия на временном объекте, то постоянный объект не изменится?

+2

Обратитесь к этому вопросу: http://stackoverflow.com/questions/728360/most-elegant-way-to-clone -a-javascript-object – Sazid

ответ

1

следующая инструкция копия только ссылка на ваш постоянный объект:

tmpObject = permObject 

Вам нужен клон permananet объекта, например:

function clone(obj) { 
    if (null == obj || "object" != typeof obj) return obj; 

    var copy = obj.constructor(); 
    for (var attr in obj) { 
    if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; 
    } 

    return copy; 
} 


var permObject = { 
data1: 1, 
data2: 4, 
} 
var tmpObject = clone(permObject); 
tmpObject.data2 -= tmpObject.data1; 
console.log(tmpObject.data2); //data2 = 3 
console.log(permObject.data2); //data2 = 3 

So reference

+0

спасибо за ответ, но могу ли я попросить вас сделать это на моем примере, потому что я потерял в этом то, что вы набрали. – Szarik

+0

Вам нужно просто клонировать ваш объект permj с функцией клонирования – InferOn

1

Вещь вы занятых в 4-м ряду:

tmpObject = permObject; 

заключается в том, что вы создаете другую ссылку на один и тот же объект, используя новую ссылку, старый объект получает изменения. Чтобы исправить это попытаться клонировать старый объект: What is the most efficient way to deep clone an object in JavaScript?

0

ссылка Dr.Nefario составляет около глубоких клонов, но в вашем случае это не имеет значения, является ли мелким или глубоким клон, так как объект находится неглубоко в любом случае. Мелкие клоны легче.

Если вы используете библиотеку подчеркивания вы могли бы просто использовать defaults:

tmpObject = _.defaults({}, permObject); 
+0

Ну, этот путь потрясающий, спасибо большое! – Szarik