如何获取Javascript对象的引用或引用计数?

10 浏览
0 Comments

如何获取Javascript对象的引用或引用计数?

如何获得对象的引用计数

- 是否有可能确定一个JavaScript对象是否有多个引用?

- 或者它是否有除了我正在访问它的引用?

- 或者仅仅获取引用计数本身?

- 我能否从JavaScript本身找到这些信息,还是需要跟踪自己的引用计数器?

显然,至少有一个引用可以让我的代码访问该对象。但我想知道的是是否还有其他引用,或者我的代码是唯一访问该对象的地方。如果没有其他引用,我希望能够删除该对象。

如果你知道答案,就没有必要阅读这个问题的其余部分。下面只是一个示例,以使事情更清楚。

用例

在我的应用程序中,我有一个名为contacts的Repository对象实例,其中包含我所有联系人的数组。还有多个Collection对象实例,例如friends集合和coworkers集合。每个集合都包含一个与contacts Repository的不同项集的数组。

示例代码

为了使这个概念更具体,考虑下面的代码。每个Repository对象实例都包含特定类型的所有项的列表。您可以有一个联系人的repository和一个单独的事件repository。为了简单起见,您只能获取、添加和删除项,并通过构造函数添加许多项。

var Repository = function(items) {

this.items = items || [];

}

Repository.prototype.get = function(id) {

for (var i=0,len=this.items.length; i

if (items[i].id === id) {

return this.items[i];

}

}

}

Repository.prototype.add = function(item) {

if (toString.call(item) === "[object Array]") {

this.items.concat(item);

}

else {

this.items.push(item);

}

}

Repository.prototype.remove = function(id) {

for (var i=0,len=this.items.length; i

if (items[i].id === id) {

this.removeIndex(i);

}

}

}

Repository.prototype.removeIndex = function(index) {

if (items[index]) {

if (/* items[i] has more than 1 reference to it */) {

// Only remove item from repository if nothing else references it

this.items.splice(index,1);

return;

}

}

}

注意remove中的注释行。如果没有其他对象引用该项,我只想从我的主要对象repository中删除该项。下面是Collection的代码:

var Collection = function(repo,items) {

this.repo = repo;

this.items = items || [];

}

Collection.prototype.remove = function(id) {

for (var i=0,len=this.items.length; i

if (items[i].id === id) {

// 从此集合中删除对象

this.items.splice(i,1);

// 告诉repository删除它(仅当没有其他引用时)

repo.removeIndxe(i);

return;

}

}

}

然后这段代码使用Repository和Collection:

var contactRepo = new Repository([

{id: 1, name: "Joe"},

{id: 2, name: "Jane"},

{id: 3, name: "Tom"},

{id: 4, name: "Jack"},

{id: 5, name: "Sue"}

]);

var friends = new Collection(

contactRepo,

[

contactRepo.get(2),

contactRepo.get(4)

]

);

var coworkers = new Collection(

contactRepo,

[

contactRepo.get(1),

contactRepo.get(2),

contactRepo.get(5)

]

);

contactRepo.items; // 包含项id 1, 2, 3, 4, 5

friends.items; // 包含项id 2, 4

coworkers.items; // 包含项id 1, 2, 5

coworkers.remove(2);

contactRepo.items; // 包含项id 1, 2, 3, 4, 5

friends.items; // 包含项id 2, 4

coworkers.items; // 包含项id 1, 5

friends.remove(4);

contactRepo.items; // 包含项id 1, 2, 3, 5

friends.items; // 包含项id 2

coworkers.items; // 包含项id 1, 5

注意coworkers.remove(2)没有从contactRepo中删除id 2。这是因为它仍然被friends.items引用。然而,friends.remove(4)导致id 4从contactRepo中删除,因为没有其他集合引用它。

总结

以上就是我想要做的事情。我相信我可以通过跟踪自己的引用计数器等方式来实现这一目标。但如果有办法使用JavaScript内置的引用管理来实现,我想了解如何使用它。

0