我正在浏览Immutable.js的源代码,而ownerID
字段是我不明白的。
以下是Map.asMutable()
和Map.asImmutable()
的来源:https://github.com/facebook/immutable-js/blob/master/src/Map.js#L171
似乎可变对象和不可变对象之间的唯一区别是它们的ownerID
。什么是ownerID
以及它用于什么?
答案 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,您会发现此功能在数据类型中很常见,每种类型都有略微修改的版本,以返回该类型的正确新版本。