Ważne jest, aby zrozumieć, że wszystkie nazwy w JavaScript są odniesieniami do innych obiektów.
Po utworzeniu obiektu z literałem obiektu nazwy po lewej stronie służą do odnoszenia obiektów już wymienionych przez nazwy po prawej stronie.
W tym przypadku, gdy robisz
blog: loca,
mówisz blog
odnieść wartości określonej przez loca
, czyli 5. Później, gdy przyrost loca
, staje 6
, oznacza to, że odnosi się do inna wartość, ale blog
nadal odnosi się do wartości 5
.
Z tego powodu uzyskujesz 5
.
Ale kiedy robisz
namepace.frog()
otrzymujesz aktualną wartość określoną przez loca
. Ponieważ przypisano 6
w getLocal
, otrzymujesz 6
.
Inkrementowanie tworzy nowy numer obiekt
Aby jeszcze bardziej oczywiste, gdy robisz
loca += 1;
lub
loca++;
co wewnętrznie dzieje, coś takiego
oldValue = loca
newValue = oldValue + 1
loca = newValue
referencyjny z ECMAScript 5.1 Specyfikacja dla +=
i ++
Ponieważ numery są obiekty niezmienne (można zmienić wartość 5
? Nie można, dlatego nazywa się obiekt niezmienny), nowy obiekt liczbowy jest tworzony z dodanym do niego obiektem, a nazwa loca
jest tworzona w celu odnoszenia nowego obiektu.
Zmienne Przedmioty
Jeśli myślisz o modyfikowalnych obiektów,
var namepace = (function() {
var loca = [];
return {
glob: function() {
loca.push(1);
return loca;
},
blog: loca,
frog: function() {
return loca;
}
};
})();
console.log(namepace.glob());
// [ 1 ]
console.log(namepace.blog);
// [ 1 ]
console.log(namepace.frog());
// [ 1 ]
Teraz zarówno blog
i loca
odnoszą się do tego samego obiektu tablicy. Co dzieje się w glob
nazywa się mutowanie.Po prostu dodajesz jeden element do obiektu tablicy o dwóch nazwach: blog
i loca
. Dlatego namepace.blog
drukuje również [ 1 ]
.