2012-04-14 4 views
4
myObj = { 
    prop1: 'alpha', 
    prop2: 'beta', 
    priceUpdatedOn: new Date() 
    }; 

    myObjQuery = myObj; 
    delete myObjQuery.priceUpdatedOn; 

console.log(myObj); 
console.log(myObjQuery); 

Когда я делаю это, priceUpdatedOn будет удален из myObj, а по какой-то причине. Любая идея почему?Странное поведение при удалении объекта свойства после копирования объекта

+0

Попробуйте эту тему: [Javascript клонировать объект теряет свои функции прототипа] (http://stackoverflow.com/questions/10151216/javascript-cloned-object-looses-its-prototype-functions) – RobG

+0

Является ли реальный вопрос * как клонировать объект JavaScript? * – alex

ответ

3

Javascript работает со ссылками. myObjQuery и myObj - это ссылки на одни и те же данные в памяти. Изменение свойства одного изменяет копию в памяти, и, следовательно, все ссылки на нее. Вы должны clone the object вместо

4

Это потому, что myObjQuery и myObj - это один и тот же объект. Когда вы делаете myObjQuery = myObj, вы не делаете копию самого объекта, а скорее копию ссылки на него. Вы никогда непосредственно не манипулируете объектами в JavaScript, а не всегда через ссылку.

EDIT: Клонирование объектов в JavaScript не является простым. У большинства библиотек, таких как jQuery или Ext, есть средства для этого. Чтобы сделать это вручную, что-то вроде этого работает.

var clone = {}; 
for(var prop in myObj) { 
    if(myObj.hasOwnProperty(prop)) { 
     clone[prop] = myObj[prop]; 
    } 
} 

Имейте в виду, что это мелкая копия. Чтобы сделать глубокую копию, вам нужно определить, являются ли сами свойства объектами и рекурсивно клонировать их тоже. Лучше всего использовать библиотеку, которая сделает все это за вас. И также имейте в виду, что это не так много красных случаев и странных вещей, как свойство конструктора объекта. JavaScript здесь действительно грязный.

+0

Итак, как мне дублировать объект? – Shamoon

+0

@Shamoon - я отредактировал свой ответ и добавил, как дублировать объект в JS –

+1

@ jimw - нет смысла ссылаться на вопрос, который не отвечает на этот вопрос. Принятый ответ там не будет рассказывать OP о копировании или клонировании объектов. – RobG

1

С этой командой

myObjQuery = myObj; 

вы не создать копию объекта, а просто копия ссылки на объект. Поэтому впоследствии оба myObjQuery и myObj все еще указывают на один и тот же объект. Если вы удалите свойство этого объекта, обе ссылки отразят это изменение.

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