Как удалить экземпляр класса js
Перейти к содержимому

Как удалить экземпляр класса js

  • автор:

Курсы javascript

Если очень хочется то testClassObj = null;
Самоудалиться ты не сможешь, можешь разве что подчистить все свойства и методы оставив пустой объект.

__________________
08.09.2014, 11:10
Интересующийся
Регистрация: 05.08.2014
Сообщений: 16

Нулл будет работать? Где-то читал что память не освобождается, где-то что освобождается, и еще слышал что это увеличивает шанс того, что сборщик мусора займется удалением.
А если не самоудаляться, а мутить отдельную функцию — это норма?

08.09.2014, 11:18
Регистрация: 12.12.2012
Сообщений: 1,398

Straj,
Объект удаляется когда на него нет ссылок. Если к объекту нельзя получить доступ — сборщик сожрет его.

08.09.2014, 11:30
Регистрация: 02.01.2010
Сообщений: 6,495

Как верно заметил tsigel, главное — не оставлять ссылок. В ручную за исключением редких конкретных случаев удалять смысла нет. Функция закончит работу и объект исчезнет.
(Правда не в приведённом вами куске кода, ибо в нём testClassObj объявлен без var т.е. в глобальной области видимости)

Правильное удаление объекта в JS

В JavaScript объект будет удален когда исчезнет последняя ссылка на него. Т.е. используя «деструктор», полностью удалить объект нельзя — можно только вычистить содержимое.

Ответ написан более трёх лет назад
Нравится 6 1 комментарий

MaxLevs

А есть ли вообще хоть какая-то возможность удалить за раз все ссылки на объект?

Например, у меня есть класс User. Происходит login и создается экземпляр для текущего пользователя, ссылки на который разлетаются по разным участкам другим объектам.
Во время logout было бы намного удобнее вызвать что-то наподобие delete someUser; , чтобы не лезть в другие объекты и не присваивать null.

delete

где результат вычисления выражения должен быть ссылкой на свойство (объекта), например:

delete object.property delete object['property'] delete object[index] delete property // удаляет свойства глобального объекта, или, // используя инструкцию with, свойства объекта, на который ссылается инструкция

Если результат вычисления выражения не является свойством (объекта), delete ничего не делает.

Параметры

Имя объекта или выражение, результатом вычисления которого является объект.

Целое число, представляющее собой индекс массива, который должен быть удалён.

Возвращаемое значение

Возвращает false, только если свойство существует в самом объекте, а не в его прототипах, и не может быть удалено. Во всех остальных случаях возвращает true.

Описание

Если оператор delete успешно выполняет удаление, он полностью удаляет свойство из объекта. Однако, если свойство с таким же именем существует в цепочке прототипов, объект унаследует это свойство из прототипа.

delete эффективен только применительно к свойствам объектов. Он не оказывает никакого влияния на имена переменных и функций. Присвоение значения свойству без указания объекта (без оператора var) иногда неверно характеризуется, как глобальная переменная, (например x = 5 ). На самом деле происходит присвоение значения свойству глобального объекта.

delete не может удалить определённые свойства встроенных объектов (таких как Object, Array, Math и так далее). В спецификации ECMA-262 они обозначены как DontDelete.

= 42; // создаёт свойство x в глобальном объекте var y = 43; // объявляет новую переменную, y myobj = >; myobj.h = 4; // создаёт свойство h в myobj myobj.k = 5; // создаёт свойство k в myobj delete x; // возвращает true (x - свойство глобального объекта и может быть удалено) delete y; // возвращает false (delete не влияет на имена переменных) delete Math.PI; // возвращает false (delete не влияет на определённые встроенные свойства) delete myobj.h; // возвращает true (свойства, определённые пользователем могут быть удалены) with (myobj)  delete k; // возвращает true (эквивалентно delete myobj.k) > delete myobj; // возвращает true (myobj это свойство глобального объекта, не переменная, поэтому может быть удалено) 

Если объект наследует свойство от прототипа и не имеет собственного свойства с таким же именем, свойство не может быть удалено при обращении через этот объект. Однако можно удалить это свойство напрямую в прототипе.

function Foo() > Foo.prototype.bar = 42; var foo = new Foo(); delete foo.bar; // возвращает true, но безрезультатно, так как bar - наследуемое свойство alert(foo.bar); // выводит 42, свойство все ещё наследуется delete Foo.prototype.bar; // удаляет свойство из прототипа alert(foo.bar); // выводит "undefined", свойство больше не наследуется 

Удаление элементов массива

Когда с помощью оператора delete удаляется элемент массива, длина массива не меняется. Например, если вы удалите a[3] , a[4] по прежнему a[4] , а a[3] не определено. Так будет даже если вы удалите последний элемент массива ( delete a[a.length-1] ).

Когда оператор delete удаляет элемент массива, этот элемент больше не существует в массиве. В следующем примере, trees[3] удаляется с помощью delete .

const trees = ["redwood", "bay", "cedar", "oak", "maple"]; delete trees[3]; console.log(3 in trees); // false 

Если вы хотите, чтобы элемент массива существовал, но имел значение undefined, используйте значение undefined вместо оператора delete . В следующем примере, trees[3] принимает значение undefined, но элемент массива все ещё существует:

const trees = ["redwood", "bay", "cedar", "oak", "maple"]; trees[3] = undefined; console.log(3 in trees); // true 

Проблема кроссбраузерности

Несмотря на то, что стандарт ECMAScript оставляет порядок итерации по свойствам объектов на усмотрение реализующей стороны, может оказаться так, что все основные браузеры поддерживают порядок итерации, основанный на принципе «свойство добавленное в объект раньше идёт раньше» (по крайней мере для свойств не находящихся в прототипе). Однако, в случае с Internet Explorer, когда кто-нибудь использует delete с каким-либо свойством, это приводит к некоторым неожиданным результатам, заставляя другие браузеры отказаться от использования простых объектов, таких как литералы объектов, в качестве ассоциативных массивов. В Internet Explorer, когда значение свойства установлено в undefined, после удаления этого свойства, если кто-нибудь позже добавит свойство с таким же именем, оно окажется в своей старой позиции, а не в конце итерационной последовательности, как ожидается.

Поэтому, если вы хотите симулировать упорядоченный ассоциативный массив в кроссбраузерной среде, вам придётся либо использовать два отдельных массива (один для ключей и один для значений), либо построить массив из объектов с одним свойством и так далее.

Внешние ссылки

  • Глубокий анализ оператора delete

Как уничтожить экземпляр класса в JS? Как контролировать ссылки на объект? [дубликат]

Достаточно ли присвоить экземпляру класса null или undefined ? Или для этого нужно использовать delete varName ? Есть например синглтон класс,в разных участках приложения, я обращаюсь к экземпляру этого класса за данными, когда все данные получены возникает необходимость уничтожить этот экземпляр. У класса создаю функцию

. destroy() < instance = null; >. 

Это вообще законно? Например в этом экземпляре класса хранились какие-то важные данные, после присвоения этому экземпляру класса null, undefined, 0, false, », delete varName можно ли эти данные вытащить из памяти, в момент когда еще не все ссылки исчезли и сборщик мусора не уничтожил переменную? Объясните как контролировать ссылки на объект и помогать сборщику мусора его ликвидировать? Как найти все места в коде, использующие этот объект?

Отслеживать
задан 27 июл 2019 в 7:13
285 2 2 серебряных знака 10 10 бронзовых знаков
– user256824
27 июл 2019 в 7:22

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

delete , присвоение null , undefined и т.п. не имеет прямого результата в виде удаления объекта из памяти. Другими словами, вам никто не может гарантировать что объект будет удалён из памяти при выполнении вышеописанных действий.

JS удаляет объекты автоматически как только счётчик ссылок на объект (aka количество переменных, ссылающихся на объект) достигает нуля. Делается это при помощи специального механизма, который называется Garbage Сollector (процесс называется Garbage Сollection). Это внутренний механизм интерпретатора. Программист не обладает средствами прямого влияния на его работу. Например, программиста не может выполнить garbage collection по своей прихоти. Или как-то сообщить сборщику мусора, о том что вот именно этот объект нужно удалить несмотря на то что на него остались ссылки.

Если следовать некоторым рекомендациям, то вопрос отсутствия механизмов управления памятью перестаёт быть острой проблемой. Вот пара ссылок по теме:

  • https://habr.com/en/post/309318/
  • https://www.smashingmagazine.com/2012/11/writing-fast-memory-efficient-javascript/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *