Порядок присваивания свойств объектам JS - PullRequest
0 голосов
/ 29 июня 2011

Просто был быстрый вопрос о том, почему определенный порядок назначения работает, а другой - нет.

Я хотел создать простую функцию «наследовать» / «копировать» (только для тестирования), которая копируетсвойства от одного объекта к другому:

var cat = { tail:"yes", hairy:"yes, hairy" };
var dog = { sick:"extremely ill"};

function inherit(obj1, obj2) {
    for (var p in obj1) 
    {
    obj2[p] = obj1[p]; // this works, but "obj1[p] = obj2[p];" doesn't. Why??
    }
}

inherit(cat, dog);

console.log(dog.tail);

Ответы [ 2 ]

1 голос
/ 29 июня 2011

Вы читаете свойства var p in obj1, поэтому эти индексы обязательно существуют только в obj1.Таким образом, попытка присвоить obj1[p] = obj2[p]; не будет работать должным образом, поскольку нет никакой гарантии (и в вашем конкретном примере это, безусловно, имеет место), что obj[p] определено.Это назначение просто присваивает undefined индексам в obj1, которых нет в obj2, и копирует значения, индексы которых существуют в obj2.

. Вам необходимо циклически переключаться на свойства каждого объектаотдельно (т.е. два цикла), хотя это тоже не очень хорошая идея, поскольку любые значения с одинаковым индексом в обоих объектах приведут к стиранию одного.Чего вы на самом деле пытаетесь достичь этим?Это кажется очень опасным / нестабильным поступком.

1 голос
/ 29 июня 2011

Вы перебираете все свойства obj1, поэтому все эти свойства существуют в obj1.

Если вы пытаетесь скопировать из obj2, то вы пытаетесь скопировать свойства, которые не(существует для этого объекта), поэтому вы вызываете ошибку.

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