Javascript 什么是「;“所有者ID”;在Immutable.js中?
我正在浏览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字段用于比较对象。与自身比较的映射将具有相同的所有
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();
}