Что такое "ownerID" в Immutable.js?
Я просматриваю исходный код Immutable.js и там поле ownerID
, которое я не понимаю.
Здесь источник Map.asMutable()
и Map.asImmutable()
: https://github.com/facebook/immutable-js/blob/master/src/Map.js#L171
Кажется, единственная разница между изменяемым и неизменяемым объектом - это их ownerID
s. Что такое ownerID
и для чего он используется?
Ответы
Ответ 1
Если вы отследите свойство:
L # 14:
import { DELETE, SHIFT, SIZE, MASK, NOT_SET, CHANGE_LENGTH, DID_ALTER, OwnerID,
MakeRef, SetRef, arrCopy } from './TrieUtils'
в 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() {}
Это свойство, которое они создают как хеш для представления виртуального владельца.
Ответ 2
Он используется для обеспечения изменчивости в возвращаемых экземплярах asMutable
. Когда вызывается asMutable
, он обеспечивает __ownerId
и возвращает текущий экземпляр назад -
asMutable() {
return this.__ownerID ? this : this.__ensureOwner(new OwnerID());
}
Затем любая поддерживающая мутирующие операции возвращает текущий экземпляр обратно, вместо создания нового экземпляра с изменениями (что является ключом к неизменности).
Например, здесь, как работает "чистый" метод, основанный на присутствии __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();
}
Обратите внимание, что при наличии этого.__ ownerID метод возвращает текущий экземпляр (тем самым сам мутируя). Но когда он отсутствует, он возвращает новую карту для обеспечения неизменности.
Ответ 3
Из исходного кода:
// 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() {}
Мое понимание вышеизложенного заключается в том, что поле this.__ownerID
используется для сравнения объектов. A Map
, сравниваемый с самим собой, будет иметь тот же ownerID
, тогда как a Map
, сравниваемый с другим Map
, увидит два разных ownerID
s.
Вы можете увидеть пример этого использования немного дальше в файле, о котором идет речь:
__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);
}
Фактически поиск всего репо, вы увидите, что эта функция является общей для всех типов данных, причем каждый тип имеет слегка измененный чтобы вернуть правильную новую версию этого типа.