Как получить счетчик ссылок для объекта
- Можно ли определить, имеет ли объект javascript несколько ссылок?
- Или, если у него есть ссылки , кроме того, к которому я обращаюсь к нему с помощью?
- Или даже просто получить счетчик ссылок?
- Могу ли я найти эту информацию из самого javascript, или мне нужно будет отслеживать мои собственные счетчики ссылок.
Очевидно, что для моего кода для доступа к объекту должна быть хотя бы одна ссылка. Но я хочу знать, есть ли какие-либо другие ссылки на него, или если мой код является единственным местом, к которому он обращается. Я хотел бы иметь возможность удалить объект, если ничего не ссылается на него.
Если вы знаете ответ, нет необходимости читать остальную часть этого вопроса. Ниже приведен пример, чтобы сделать вещи более понятными.
Использовать регистр
В моем приложении у меня есть экземпляр объекта Repository
с именем contacts
, который содержит массив ВСЕ моих контактов. Существуют также несколько экземпляров объектов Collection
, таких как коллекция friends
и коллекция coworkers
. Каждая коллекция содержит массив с другим набором элементов из contacts
Repository
.
Пример кода
Чтобы сделать эту концепцию более конкретной, рассмотрите приведенный ниже код. Каждый экземпляр объекта Repository
содержит список всех элементов определенного типа. У вас может быть репозиторий Контакты и отдельный репозиторий События. Чтобы это было просто, вы можете просто добавлять, добавлять и удалять элементы и добавлять их через конструктор.
var Repository = function(items) {
this.items = items || [];
}
Repository.prototype.get = function(id) {
for (var i=0,len=this.items.length; i<len; 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<len; 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
с комментарием. Я хочу удалить объект из моего основного хранилища объектов, если никакие другие объекты не ссылаются на элемент. Здесь 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<len; i++) {
if (items[i].id === id) {
// Remove object from this collection
this.items.splice(i,1);
// Tell repo to remove it (only if no other references to it)
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; // contains item ids 1, 2, 3, 4, 5
friends.items; // contains item ids 2, 4
coworkers.items; // contains item ids 1, 2, 5
coworkers.remove(2);
contactRepo.items; // contains item ids 1, 2, 3, 4, 5
friends.items; // contains item ids 2, 4
coworkers.items; // contains item ids 1, 5
friends.remove(4);
contactRepo.items; // contains item ids 1, 2, 3, 5
friends.items; // contains item ids 2
coworkers.items; // contains item ids 1, 5
Обратите внимание, что coworkers.remove(2)
не удалил id 2 из contactRepo? Это связано с тем, что он по-прежнему ссылается на friends.items
. Тем не менее, friends.remove(4)
вызывает удаление id 4 из contactRepo
, потому что никакой другой коллекции не ссылается на него.
Резюме
Выше было то, что я хочу сделать. Я уверен, что есть способы сделать это, отслеживая мои собственные счетчики ссылок и т.д. Но если есть способ сделать это с помощью встроенного управления ссылками javascript, я бы хотел узнать, как его использовать.