2014-02-09 4 views
0

Я пытаюсь создать копию объекта a, без необходимости вручную вводить его свойство в объект b. В этом коде b просто ссылается на a. Я хочу создать новую версию a, так что, когда я добавлю свойство в b, оно не будет видно через a.JavaScript: Как сделать копию объекта?

var a = new Object(); // create an empty object 
var b = a;    // now b refers to the same object 
b.test = 1;   // add a new property to b 
alert(a.test);   // => 1: the new property is also visible through a 
a === b;    // => true: a and b refer to the same object 
+2

'хранить значения (a) a в b' должно быть« назначить ссылку на один и тот же объект на 'b'». – RobG

+1

Действительно ли вы намерены «быть» функцией? Ваш комментарий в этой строке предполагает иное. –

+0

«b относится к одному и тому же объекту» означает, что «добавить новое свойство в b» равно «добавить новое свойство в». – leaf

ответ

2

Вы должны быть осторожны при работе с объектами Javascript и равенства (= ) оператор. Этот оператор не создает копию объекта, а только присваивает ссылку на исходный внутренний объект.

Это означает, что в вашем случае, бне хранить значение (s) из , но после вызова

var b = a; 

как и б точки к тот же объект в памяти! Поэтому изменение любых свойств b также изменяет их для a (опять же: они являются одним и тем же объектом внутри).

Чтобы создать копию объекта, вы должны вручную скопировать все свойства этого:

var a = {}; // create an empty object 
a.prop1 = 1; // set a property of this object 
var b = {}; // create another empty object 
b.prop1 = a.prop1; // copy all properties (in this case: only one) of a to b 
b.test = 1; // add a new property to b 
alert(a.test); // => undefined, as .test is only defined for b 
a === b; // => false, as a and b are different objects. 

Изящное решение проблемы клонирования JS-объекты можно найти здесь: How do I correctly clone a JavaScript object?

+0

* «' 'на самом деле не объект» * Это! Функции также являются объектами. –

+0

Вы правы! Отредактировано соответственно. – dominikus

3

В обычный JavaScript вы можете сделать:

var copy = JSON.parse(JSON.stringify(myObj)); 

См: http://jsfiddle.net/kukiwon/AyKdL/

+1

Это, конечно, не работает с функциями. –

+0

@FelixKling, правильно, но тогда вопрос должен быть изменен. – Kukiwon

1

В вашем примере «a» - это просто объект функции, и вы просто создаете дополнительные указатели.

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

var a1 = new a(); 
var b1 = new a(); 
a1.test = 1; 
b1.test = 2; 

a1 != b1 

Преимущество использования функции в качестве класса является использование Object.prototype, наследование и экземпляр проверки. Если вы хотите просто хранилище данных, а затем просто изменить его родового объекта

var a = {}; 
var b = {}; 
a.test = 1; 
b.test = 2; 

«JavaScript хорошие части» является абсолютной необходимостью

http://www.youtube.com/watch?v=hQVTIJBZook

http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742

2

Как об использовании глубоко как показано ниже. Это из «Javascript Patterns» Стояна Стефанова.

function extendDeep(parent, child) { 
    var i, 
     toStr = Object.prototype.toString, 
     astr = "[object Array]"; 

    child = child || {}; 

    for (i in parent) { 
     if (parent.hasOwnProperty(i)) { 
      if (typeof parent[i] === "object") { 
       child[i] = (toStr.call(parent[i]) === astr) ? [] : {}; 
       extendDeep(parent[i], child[i]); 
      } else { 
       child[i] = parent[i]; 
      } 
     } 
    } 
    return child; 
} 
+1

if (parent.hasOwnProperty (i) &&! Child.hasOwnProperty (i)) {....} Если вы не хотите перезаписывать свойства, это то, что там – zloctb

Смежные вопросы