2016-03-14 13 views
19

Przechodzę przez kod źródłowy Immutable.js i istnieje pole ownerID, którego nie rozumiem.Co to jest "ownerID" w pliku Immutable.js?

Oto źródło Map.asMutable() i Map.asImmutable(): https://github.com/facebook/immutable-js/blob/master/src/Map.js#L171

Wydaje się, że jedyną różnicą pomiędzy zmienny i niezmiennej obiektu są ich ownerID s. Co to jest ownerID i do czego służy?

+0

Ż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". –

+0

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. –

+0

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. –

Odpowiedz

5

Jeśli utwór z powrotem własności:

L # 14:

import { DELETE, SHIFT, SIZE, MASK, NOT_SET, CHANGE_LENGTH, DID_ALTER, OwnerID, 
      MakeRef, SetRef, arrCopy } from './TrieUtils' 

w src/TrieUtils.js:

L # 36:

// A function which returns a value representing an "owner" for transient writes 
// to tries. The return value will only ever equal itself, and will not equal 
// the return of any subsequent call of this function. 
export function OwnerID() {} 

Jest to jakaś własność, którą tworzą jak hash reprezentujący wirtualnego właściciela.

+0

Otrzymuję, że 'nowy ID właściciela' jest w zasadzie' Symbol() '. Co oznacza właściciel wirtualny i jak odnosi się do niezmienności? –

+0

@Linksku dodając ID jako właściwość jest jak tworzenie unikatowego hasha, ale nazywają go właścicielem, możesz mieć 2 identyczne obiekty o różnych hasach, co oznacza, że ​​nie są tym samym obiektem, nie odnosi się to do niezmienności, ani twoje pytanie nie dotyczy niezmienności, chciałeś tylko wiedzieć, co to jest ID właściciela, prawda? – ProllyGeek

+0

Dotyczy niezmienności, ponieważ jedyną różnicą między zmiennym i niezmiennym obiektem w ImmutableJS jest właściwość 'ownerID'. Chcę zrozumieć, dlaczego dodali tę nieruchomość i do czego ona służy. –

2

Z source code:

// A function which returns a value representing an "owner" for transient writes 
// to tries. The return value will only ever equal itself, and will not equal 
// the return of any subsequent call of this function. 
function OwnerID() {} 

Moje rozumienie powyższego jest, że pole this.__ownerID używana jest do porównywania obiektów. Porównywany z samym sobą Map będzie miał ten sam ownerID, podczas gdy Map porównywany z innym Map będzie widział dwa różne ownerID s.

można zobaczyć przykład tego Użycie A little farther down in the file in question:

__ensureOwner(ownerID) { 
    if (ownerID === this.__ownerID) { 
    return this; 
    } 
    if (!ownerID) { 
    this.__ownerID = ownerID; 
    this.__altered = false; 
    return this; 
    } 
    return makeMap(this.size, this._root, ownerID, this.__hash); 
} 

W rzeczywistości, searching the entire repo, zobaczysz, że funkcja ta jest wspólna dla różnych typów danych, a każdy typ ma wersję nieco zmodyfikowaną, aby powrócić poprawna nowa wersja tego typu.

4

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.