2016-03-14 14 views
19

Sto passando attraverso il codice sorgente di Immutable.js e c'è un campo ownerID che non capisco.Che cos'è il "ownerID" in Immutable.js?

Ecco la fonte per Map.asMutable() e Map.asImmutable(): https://github.com/facebook/immutable-js/blob/master/src/Map.js#L171

Sembra che l'unica differenza tra un mutevole e un oggetto immutabile, sono i loro ownerID s. Che cos'è un ownerID e a cosa serve?

+0

Nessuna risposta fornisce una spiegazione chiara, ecco la mia attuale comprensione: 'ownerID' è fondamentalmente' isMutable'. Tuttavia, hanno bisogno di un modo per confrontare gli oggetti mutabili per qualsiasi motivo, quindi hanno bisogno di un identificatore univoco per ogni oggetto. 'isMutable' implica che sia un booleano, quindi lo hanno chiamato' ownerID'.Potrebbe essere rinominato 'mutableObjectID'. –

+0

Se guardi l'ultima parte della mia risposta qui sotto, vedrai che ciò che sta facendo il loro codice (credo) sta verificando se l'oggetto è mutato controllando se il 'ownerID' è cambiato. Se è mutato, restituiscono un nuovo oggetto. Se non è mutato o il 'ownerId' non esiste, restituisce solo l'oggetto corrente poiché non c'è motivo di crearne uno nuovo. –

+0

Non è quello che è "__altered"? Sembra che debbano confrontare gli oggetti con altri oggetti. Non so perché però. –

risposta

5

Se si traccia indietro la proprietà:

L # 14:

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

in 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() {} 

Sono alcune proprietà che creano come hash per rappresentare un proprietario virtuale.

+0

Ho capito che 'nuovo ID proprietario 'è in pratica' Simbolo() '. Cosa significa un proprietario virtuale e in che modo ciò si riferisce all'immutabilità? –

+0

@Linksku aggiungendo l'ID come una proprietà è come creare un hash univoco, ma lo chiamano proprietario, potresti avere 2 stessi oggetti identici con diversi hash, questo significa che non sono lo stesso oggetto, questo non si riferisce all'immutabilità, e nessuna delle tue domande si riferisce all'immutabilità, volevi solo sapere che cos'è questo OwnerID, correggere? – ProllyGeek

+0

Si riferisce all'immutabilità perché l'unica differenza tra un oggetto mutabile e immutabile in ImmutableJS è la proprietà 'ownerID'. Voglio capire perché hanno aggiunto questa proprietà e per cosa serve. –

2

Dal 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() {} 

La mia comprensione di quanto sopra è che il campo this.__ownerID viene utilizzato per confrontare gli oggetti. Uno Map confrontato con se stesso avrà lo stesso ownerID, mentre un Map confrontato con un altro Map vedrà due diversi ownerID s.

È possibile vedere un esempio di questo uso un 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); 
} 

Infatti, searching the entire repo, vedrai che questa funzione è comune tra i tipi di dati, con ogni tipo con una versione leggermente modificata di tornare una nuova versione corretta di quel tipo.

4

Viene utilizzato per garantire la mutabilità in asMutable istanze restituite. Quando asMutable viene richiamato, assicuri __ownerId e restituisce l'istanza corrente posteriore -

asMutable() { 
    return this.__ownerID ? this : this.__ensureOwner(new OwnerID()); 
} 

Poi alcuna supported operazioni mutanti restituire l'istanza corrente posteriore, invece di creare una nuova istanza con le modifiche (che è la chiave per immutability) .

esempio, ecco come il metodo "clear" funziona basato sulla presenza di __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(); 
} 

noti che quando questo .__ ownerid è presente, il metodo restituisce l'istanza corrente (quindi mutando stesso) . Ma quando è assente, restituisce una nuova mappa per garantire l'immutabilità.

Problemi correlati