如何获取Javascript对象的引用或引用计数?
如何获取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内置的引用管理来实现,我想了解如何使用它。