Удаление всех ссылок на объект для полной его деинициализации

270
30 января 2017, 19:25

При переписывании ранее написанного кода понадобилось держать в памяти все экземпляры класса. Все экземпляры класса хранятся как статическое свойство (строка *) (если можно его так назвать) в виде массива, который пополняется новым элементом при создании нового экземпляра класса. Код имеет следующий вид:

class Child {
  constructor(name) {
    this.name = name;
    (Child.__instances__ = Child.__instances__ || []).push(this); // *
  }
}
class Doughter extends Child {
  constructor(name) {
    super(name);
  }
}
class Son extends Child {
  constructor(name) {
    super(name);
  }
}
class DifferentClass {
  constructor() {
  }
  initializeChildren() {
    this.son       = new Son("Ваня");
    this.doughters = [new Doughter("Маня"), new Doughter("Аня")];
  }
  removeVanya() {
    console.log("Ваня помирает");
    this.son = null;
  }
}
let obj = new DifferentClass();
obj.initializeChildren();
obj.removeVanya();
console.log(Child.__instances__);

Если выполнить этот код, то можно увидеть, что, даже не смотря на то, что в объекте obj свойства son больше нет, то все равно данный экземпляр остался в массиве __instances__. А, как известно из уже данных ответов, экземпляр класса существует ровно до тех пор, пока на него хотя бы откуда-то ссылаются.

Я решил пойти по пути наименьшего сопротивления и напрямую удалить нужный (точнее ненужный больше) элемент, что, по понятным причинам, успехом не увенчалось:

removeVanya() {
  console.log("Ваня помирает");
  Child.__instances__[this.son] = null;
  this.son = null;
}

Собственно, вопрос в том и состоит: как удалить нужный элемент в массиве __instances__, чтобы больше нигде не содержалось этого экземпляра?

Answer 1

поле __instances__ - является массивом. Для удаления элемента из массива можно применить метод splice. Для этого нужно знать индекс удаляемого элемента. Определить индекс можно с помощью метода indexOf

В итоге функция удаления может принять вид:

removeVanya() {
  console.log("Ваня помирает");
  var childIndex = Child.__instances__.indexOf(this.son);
  if(childIndex != -1)
    Child.__instances__.splice(childIndex,1);
  this.son = null;
}

В текущем же коде, при вызове Child.__instances__[this]=null идет преобразование this в строку, скорее всего [Object object], и присваиванию в одноименное свойство в массиве значения null.

READ ALSO
Помогите переделать скрипт

Помогите переделать скрипт

Помогите переделать скрипт чтоб результат выводился так ЧАС:МИНУТ:СЕК

264
используя цикл for пройти все елементы

используя цикл for пройти все елементы

при каждом клике добавлять елементу красный цвет, когда все елементы будут красного цвета, то по одному клику с конца возвращать елеметам...

320
SASS\SCSS: селекторы разделенные запятой

SASS\SCSS: селекторы разделенные запятой

Есть подобный код на CSS

363