Służy do zapewnienia wartości zmienności w asMutable
zwróconych instancji. Kiedy asMutable
jest wywoływany, zapewnia ona __ownerId
i zwraca bieżącą instancję back -
asMutable() {
return this.__ownerID ? this : this.__ensureOwner(new OwnerID());
}
Wtedy wszelkie supported operacje mutowania powrócić bieżące wystąpienie z powrotem, zamiast tworzenia nowej instancji ze zmianami (co jest kluczem do niezmienności) .
przykład, oto jak „czysty” sposób działa na podstawie obecności __ownerId
-
clear() {
if (this.size === 0) {
return this;
}
if (this.__ownerID) {
this.size = 0;
this._root = null;
this.__hash = undefined;
this.__altered = true;
return this;
}
return emptyMap();
}
Zauważ, że gdy ten .__ ownerid jest obecna metoda zwraca bieżącą instancję (co mutacji się) . Ale gdy jest nieobecny, zwraca nową mapę dla zapewnienia niezmienności.
Żadna z odpowiedzi nie daje jasnego wyjaśnienia, oto moje obecne rozumienie: 'ownerID' jest po prostu' isMutable'. Potrzebują jednak sposobu, aby porównać obiekty zmienne z jakiegokolwiek powodu, dlatego potrzebują unikalnego identyfikatora dla każdego obiektu. 'isMutable' oznacza, że jest to boolean, więc nazwali go' ownerID'.Mógłby zostać zmieniony na "mutableObjectID". –
Jeśli spojrzysz na ostatnią część mojej odpowiedzi poniżej, zobaczysz, że ich kod (jak sądzę) sprawdza, czy obiekt został zmutowany, sprawdzając czy 'ownerID' został zmieniony. Jeśli zmutowano, zwracają nowy obiekt. Jeśli nie został zmutowany lub "ownerId" nie istnieje, po prostu zwracają bieżący obiekt, ponieważ nie ma powodu, aby utworzyć nowy. –
Czy to nie jest to, do czego służy '__terered'? Wygląda na to, że muszą także porównywać obiekty z innymi obiektami. Nie wiem dlaczego. –