#javascript
Достаточно ли в JavaScript для того, чтобы деинициализировать объект, установить this в null? Под деинициализировать я имею в виду полностью удалить его, очистив занимаемую им память. Например, можно ли внутри метода совершенно другого класса сделать так: class MainClass() { constructor() { this.anotherClassObject = new AnotherClass(); } destroyAnotherClassObject() { this.anotherClassObject = null; } } mainObject = new MainClass(); mainObject.destroyAnotherClassObject(); Достаточно ли будет этого, чтобы удалить объект и, главное, освободить из-под него память?
Ответы
Ответ 1
В javascript объект полностью удалится только в том случаи, если до него будет невозможно добраться из объекта window. То есть пока до объекта можно добраться по ссылкам начиная от самого корневого объекта window, то он будет находится в памяти, Garbage Collection или сокращенно GC его не уничтожит. Другими словами, чтобы объект был удален, нужно удалить на него все ссылки. Конкретно в Вашем случаи достаточно просто "занулить" ссылку на сам экземпляр. class SomeClass { } let someInstance = new SomeClass(); someInstance = null; // этого достаточно чтобы объект был удален из памяти Если рассматривать конкретный пример автора (код ниже), то вышесказанное верно и для него. Ведь ссылка someInstance на экземпляр класса SomeClass объявлена в глобальном контексте и уже по ней можно получить доступ к созданному внутри экземпляру другого класса AnotherClass - window.someInstance.anotherInstance. class SomeClass { constructor(){ this.anotherInstance = new AnotherClass(); } destroy(){ this.anotherInstance = null; } } let someInstance = new SomeClass(); // если по какой-то причине экземпляр someInstance // остается нужным, а необходимости в экземпляре AnotherClass // уже нет, его можно удалить вызвав someInstance.destroy() И напоследок остается напомнить что в js с помощью замыканий можно имитировать приватный свойства и функции, до которых будет невозможно добраться от самого корневого объекта, что вызовет увеличение потребления памяти до тех пор, пока не будет удален объект содержащий в себе это замыкание.Ответ 2
Объект в JavaScript будет удален когда на него никто не будет ссылаться. Если Ваш объект занимает много памяти (например содержит в себе большой массив данных) и Вам нужно принудительно ее освободить, то напишите какой-нибудь метод Free у класса, который эту память освободит и вызывайте его по необходимости. Но опять таки, эта память освободится, когда на нее никто не будет ссылаться. Так, что целесообразно такие поля делать приватными
Комментариев нет:
Отправить комментарий