Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Как в JavaScript нужно правильно деинициализировать объект?

#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 у класса, который эту память освободит и вызывайте его по необходимости. Но опять таки, эта память освободится, когда на нее никто не будет ссылаться. Так, что целесообразно такие поля делать приватными

Комментариев нет:

Отправить комментарий