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à.
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'. –
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. –
Non è quello che è "__altered"? Sembra che debbano confrontare gli oggetti con altri oggetti. Non so perché però. –