什么是" ownerID"在Immutable.js?

时间:2016-03-14 21:51:56

标签: javascript immutable.js

我正在浏览Immutable.js的源代码,而ownerID字段是我不明白的。

以下是Map.asMutable()Map.asImmutable()的来源:https://github.com/facebook/immutable-js/blob/master/src/Map.js#L171

似乎可变对象和不可变对象之间的唯一区别是它们的ownerID。什么是ownerID以及它用于什么?

3 个答案:

答案 0 :(得分:4)

如果您追溯该物业:

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

它们创建的某些属性就像哈希来表示虚拟所有者。

答案 1 :(得分:3)

它用于确保asMutable返回实例中的可变性。调用asMutable时,它会确保__ownerId并返回当前实例 -

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

然后,任何supported变异操作都会返回当前实例,而不是创建带有更改的新实例(这是不可变性的关键)。

,例如,基于__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时,该方法返回当前实例(从而变异本身)。但是当它不存在时,它会返回一张确保不变性的新地图。

答案 2 :(得分:1)

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

我对上述内容的理解是this.__ownerID字段用于比较对象。与自身进行比较的Map将具有相同的ownerID,而与另一个Map进行比较的Map会看到两个不同的ownerID

您可以在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);
}

事实上,searching the entire repo,您会发现此功能在数据类型中很常见,每种类型都有略微修改的版本,以返回该类型的正确新版本。