Подтвердить что ты не робот

Что такое "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 и для чего он используется?

4b9b3361

Ответ 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);
}

Фактически поиск всего репо, вы увидите, что эта функция является общей для всех типов данных, причем каждый тип имеет слегка измененный чтобы вернуть правильную новую версию этого типа.