• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed JS - jak usunąć obiekt

Object Storage Arubacloud
0 głosów
2,372 wizyt
pytanie zadane 7 marca 2017 w JavaScript przez hoktaur Pasjonat (22,250 p.)
zamknięte 9 marca 2017 przez hoktaur

Załóżmy mam stworzoną tablice z obiektami:

var test = [];
test.push(new klasa());
test.push(new klasa());
test.push(new klasa());

i teraz ze względu na pewne warunki w metodzie danego obiektu przestaje mi on być potrzebny i chciałbym go usunąć  jak to zrobić?

Czytałem coś o fakcie że delete nie zadziała na sam obiekt i o garbage collector, ale nie bardzo wiem jak to zrobić?

 

 

komentarz zamknięcia: Problem rozwiązałem sam (link do rozwiązanie na samym dole w komentarzu), ale podpowiedzi były super .... THX
komentarz 9 marca 2017 przez rosomack Nowicjusz (160 p.)
cześć. zastanawiam się czy chcesz usunąć obiekt ogólnie z pamięci - "bo tak" czy usunąć go z arraya? bo, gdy to drugie to wystarczy `someArray.splice(x,1)`, gdzie `x` to indeks który chcemy usunąć, a 1 to ilośc obiektów które chcemy usunąć (można chcieć usunąć obiekty 2 o indeksie 2,3 - a wtedy `someArray.splice(2,2)`)

gdy nie wiesz jaki jest indeks obiektu który chcesz usunąć - metoda `indexOf` :)
komentarz 9 marca 2017 przez hoktaur Pasjonat (22,250 p.)
Problem był nie tyle z samym usunięciem elementu co z wyszukaniem odpowiedniej zmiennej (jej indexu) z poziomu metody obiektu podrzędnego ... zmiana myślenia oraz przebudowa większości kodu pomogła.

1 odpowiedź

+3 głosów
odpowiedź 7 marca 2017 przez ScriptyChris Mędrzec (190,190 p.)

W JavaScript nie możesz samodzielnie usunąć obiektu, zajmuje się tym GarbageCollector, o którym wspomniałeś. Działa on automatycznie, programista nie za bardzo ma wpływ na to kiedy GC uruchamia się i co wtedy usuwa. Możesz przypisać wartość null dla danego obiektu "podpowiadając" GC, że z niego nie korzystasz - wtedy go usunie.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

Operator delete usuwa propertisy danego obiektu a nie obiekty.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

 

komentarz 7 marca 2017 przez ScriptyChris Mędrzec (190,190 p.)
edycja 7 marca 2017 przez ScriptyChris

Nadaj każdemu elementowi listy atrybut id (najprościej w formie inkrementowalnej liczby, jak w bazie danych). W ten sposób przy usuwaniu będziesz mógł namierzyć **w liście node'ów** ten, którego id zgadza się z atrybutem id usuniętego z DOM elementu.

[edit]

Drobne sprostowanie (zamiast tego, co skreśliłem) => w tablicy (o nazwie list) obiektów (o nazwach country), które mają pole node.

Czyli mając w DOM listę node'ów z nadanymi atrybutami id, podczas usuwania sprawdzaj w tablicy list czy znajduje się obiekt, którego pole node zawiera to id.

komentarz 7 marca 2017 przez hoktaur Pasjonat (22,250 p.)

No jest to jakieś rozwiązanie, normalnie bym się tak z tym nie ciaćkał tylko operowałbym w DOM'ie ale chciałem to ładnie w obiektówce zrobić, ale widzę kilka problemów:

- co jak country nie będzie już należeć do conutries tylko np klasy world albo np. tu i tu

- id powinno być jedyne w całym dokumencie a ja będę miał np. tak jak w przykładzie 3 listy każda w innym obiekcie countries 3 x id='1...x'

A jest możliwość żebym przekazał informację o obiekcie countries do country np.:

test.push(new country(this));

i potem się do tego odwołał w metodzie w country?

albo w metodzie country podczas kasowania wymusił spr. tabeli list?

 

komentarz 7 marca 2017 przez hoktaur Pasjonat (22,250 p.)
hmmm ... zastanawiam się jeszcze ... może gdzieś zrobiłem błąd koncepcyjny całej klasy?
komentarz 8 marca 2017 przez ScriptyChris Mędrzec (190,190 p.)

Wg mnie zaczynasz kombinować. Spróbuj z nadaniem atrybutu id. Aby było unikatowe, to nadawaj je w jakiejś formie np. "nazwaKlasy-0", "nazwaKlasy-1" itd., wtedy przy usuwaniu sprawdzaj czy element z listy posiada takie id jak ten, który kliknąłeś (przeznaczony do usunięcia) - jeśli tak, to usuwaj go z tablicy.

Co do zapisu:

test.push(new country(this));

, to musiałbyś zmodyfikować konstruktor dla klasy country (przy okazji, przyjęło się nazywać klasy z dużej litery), bo obecnie jako parametr przyjmuje name (czyli jakiś string), a Ty chcesz tam przekazać obiekt za pomocą wskaźnika this:

function country(name) {
     /**
       * funkcja będąca konstruktorem jako parametr przyjmuje 'name', 
       * ktory później używasz jako stringa do wstawiania wewnątrz elementów HTML, 
       * więc nie możesz tu przesłać obiektu w obecnej sytuacji
       */

      this.name = name;

      /** dalszy kod */
}

Spróbuj ewentualnie zrobić to w ten sposób:

test.push( new country( '' ).bind( this ) );

W momencie, gdy w JavaScript tworzysz obiekt za pomocą operatora new, kontekst this zostaje automatycznie ustawiony na ten obiekt. Żeby to zmienić, spróbuj zastosować metodę bind. Jako, że konstruktor w JS to tak na prawdę funkcja (funkcje w JS to też obiekty, tyle że z możliwością wywołania kodu), możesz zmienić jej kontekst wywoławczy na inny obiekt. Nie robiłem do tej pory czegoś takiego (zmiana kontekstu wywoławczego dla konstruktora), ale w teorii powinno działać.

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/new

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Bound_functions_used_as_constructors

komentarz 9 marca 2017 przez hoktaur Pasjonat (22,250 p.)

Ok zrobiłem po swojemu bez id tylko z class'ami zmieniłem podejście i się udało, a moje rozwiązanie znajdziecie tutaj

THX za pomoc :)

Podobne pytania

0 głosów
2 odpowiedzi 2,550 wizyt
pytanie zadane 20 grudnia 2017 w Systemy operacyjne, programy przez niezalogowany
0 głosów
2 odpowiedzi 9,901 wizyt
0 głosów
1 odpowiedź 1,833 wizyt

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...