Почему это работает? Очистка объекта JavaScript, используемого в качестве формы

0

Возьмите этот объект javascript:

dog = {
   owner: 'mike'
   food: 'kibbles'
   breed: {color: 'brown'
           type: 'corgie'
           gender:'f'  
          }
   neuter:'y'
   spay:'no'
   name:'Sparky'
}

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

dog = {};

Ничего не происходит с полями.

Однако, если я изменяю весь объект на:

dog.info = {
   owner: 'mike'
   food: 'kibbles'
   breed: {color: 'brown'
           type: 'corgie'
           gender:'f'  
          }
   neuter:'y'
   spay:'no'
   name:'Sparky'
}

И затем я очищаю объект путем повторной инициализации объекта:

dog.info = {};

Оно работает. Я использую это, чтобы очистить угловую форму изнутри службы. Кто-нибудь знает, почему так? Ваша помощь очень ценится, как всегда. Спасибо.

Теги:

1 ответ

2
Лучший ответ

Это во многом зависит от того, как именно вы используете dog, и, поскольку вы этого не сделали, я состану на собственном примере.

Это связано с тем, как объекты хранятся в переменных. Возьмем следующий пример:

var dog = {name: 'bob'};
var x = dog;
console.log(x.name); // 'bob'
x.name = 'george';
console.log(x.name); // 'george'
console.log(dog.name); // 'george'
dog = {name: 'frank'}; // dog and x now hold two different objects!
console.log(x.name); // 'george'
console.log(dog.name); // 'frank'

Когда я устанавливаю x равным dog, x хранит тот же объект, что и dog, поэтому, когда я его модифицировал, dog была изменена. Однако, когда я переписывал dog новым объектом, x все еще содержал старый объект, а не обновлялся до нового.

Используя dog.info и никогда не переопределяя dog, вы сохранили исходный объект, поэтому все еще ссылается на объект, который обновляется.

var dog = {info: {name: 'bob'}};
var x = dog;
console.log(x.info.name); // 'bob'
x.info.name = 'george';
console.log(x.info.name); // 'george'
console.log(dog.info.name); // 'george'
dog.info = {name: 'frank'}; // dog and x still hold the same object.
console.log(x.info.name); // 'frank'
console.log(dog.info.name); // 'frank'
  • 0
    ооо ... понял ... это имеет смысл. Спасибо.
  • 0
    Хорошо ... Я ценю, что ты нашел время, Кевин.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню