Javascript 什么是「;“所有者ID”;在Immutable.js中?

Javascript 什么是「;“所有者ID”;在Immutable.js中?,javascript,immutable.js,Javascript,Immutable.js,我正在浏览Immutable.js的源代码,其中有一个我不理解的ownerID字段 以下是Map.asMutable()和Map.asImmutable()的源代码: 可变对象和不可变对象之间的唯一区别似乎是它们的所有者IDs。什么是所有者ID,它用于什么?如果您追溯属性: L#14: 在src/TrieUtils.js中 L#36: 这是他们创建的一些属性,如哈希,用于表示虚拟所有者。来自: 我对上述内容的理解是,this.\u ownerID字段用于比较对象。与自身比较的映射将具有相同的所有

我正在浏览Immutable.js的源代码,其中有一个我不理解的
ownerID
字段

以下是
Map.asMutable()
Map.asImmutable()
的源代码:


可变对象和不可变对象之间的唯一区别似乎是它们的
所有者ID
s。什么是
所有者ID
,它用于什么?

如果您追溯属性:

L#14:

在src/TrieUtils.js中

L#36:

这是他们创建的一些属性,如哈希,用于表示虚拟所有者。

来自:

我对上述内容的理解是,
this.\u ownerID
字段用于比较对象。与自身比较的
映射
将具有相同的
所有者ID
,而与另一个
映射
比较的
映射
将看到两个不同的
所有者ID

您可以在下面的示例中看到此用法:

事实上,您将看到此函数在数据类型中很常见,每种类型都有一个稍微修改过的版本,以返回该类型的正确新版本。

它用于确保可更改的返回实例中的可变性。当调用
asMutable
时,它确保一个
\uu ownerId
并返回当前实例-

asMutable() {
    return this.__ownerID ? this : this.__ensureOwner(new OwnerID());
}
然后,任何变异操作都会返回当前实例,而不是创建带有更改的新实例(这是不变性的关键)

例如,“清除”方法是基于
\uu 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();
}

请注意,当这个.uuuuOwnerId存在时,该方法返回当前实例(从而改变自身)。但是当它不存在时,它会返回一个新的映射以确保不变性。

我知道
newownerid
基本上是
Symbol()
。虚拟所有者是什么意思?这与不变性有什么关系?@Linksku将ID添加为属性就像创建一个唯一的散列,但他们称之为所有者,您可能有两个相同的对象,具有不同的散列,这意味着它们不是同一个对象,这与不变性无关,你的问题都与不变性无关,你只是想知道OwnerID是什么,对吗?它与不变性有关,因为在ImmutableJS中,可变对象和不可变对象之间的唯一区别是
OwnerID
属性。我想了解他们为什么添加这个属性以及它的用途。这个答案实际上没有帮助。答案中没有一个给出明确的解释,这是我目前的理解:
ownerID
基本上是
isMutable
。然而,无论出于何种原因,它们都需要一种比较可变对象的方法,因此它们需要每个对象的唯一标识符
isMutable
意味着它是一个布尔值,因此他们将其命名为
ownerID
。它可以重命名为
mutableObjectID
。如果你看我下面答案的最后一部分,你会发现他们的代码(我想)是通过检查
所有者id
是否发生了变化来检查对象是否发生了变化。如果它发生了变异,它们将返回一个新对象。如果它没有变异,或者
所有者ID
不存在,它们只返回当前对象,因为没有理由创建新对象。这不是
\u changed
的目的吗?似乎他们也必须将对象与其他对象进行比较。我不知道为什么。
// 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() {}
__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);
}
asMutable() {
    return this.__ownerID ? this : this.__ensureOwner(new 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();
}