[JS] Object destroyen

Pagina: 1
Acties:
  • 207 views sinds 30-01-2008
  • Reageer

  • André
  • Registratie: Maart 2002
  • Laatst online: 26-05 00:33

André

Analytics dude

Topicstarter
Hoe kan ik in javascript een object destroyen?
code:
1
2
3
4
5
6
7
8
9
function Blok(x, y)
{
  this.x = x;
  this.y = y;
  this.html = document.createElement("div");
  document.body.appendChild(thid.html);
}

Vierkant = new Blok(10, 10);

Hoe kan ik nu het object Vierkant leegmaken/trashen/destroyen.

Is dat zoiets van Vierkant = ""; en denk ik nu te moeilijk?

En als het object nou een HTML element bevat (div) word ie dan ook weggehaald na destroyen, of moet ik gewoon de style op display:none zetten.

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 11:17

crisp

Devver

Pixelated

code:
1
2
document.body.removeChild(Vierkant);
Vierkant = null;

should do the trick...

Intentionally left blank


  • André
  • Registratie: Maart 2002
  • Laatst online: 26-05 00:33

André

Analytics dude

Topicstarter
Dus ik denk gewoon te moeilijk... |:( thnx

Verwijderd

Op woensdag 24 juli 2002 09:04 schreef Yogho het volgende:
Hoe kan ik in javascript een object destroyen?
Hoe kan ik nu het object Vierkant leegmaken/trashen/destroyen.
Waarom wil je dit? Memory management bestaat niet echt in JavaScript. Als je de variabele/het object Vierkant niet meer nodig hebt, kun je er gewoon voor kiezen 'm niet meer te gebruiken. Of 'm idd op null te zetten.
En als het object nou een HTML element bevat (div) word ie dan ook weggehaald na destroyen, of moet ik gewoon de style op display:none zetten.
Die this.html is alleen een pointer naar het Object in het document...door het object te destroyen doe je dus niks met de eigenlijke DIV. Die zul je dus, zoals Crisp al zei, met removeChild moeten weghalen.

Overigens is het destroyen van Object-properties wel mogelijk. Vergelijk:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function MyObject( a, b, c ) {
    this.a = a;
    this.b = b;
    this.c = c;
}

var theObj = new MyObject(1,2,3);

theObj.a = null;
alert(theObj.a); // null

var _undef;
theObj.b = _undef;
alert(theObj.b); // undefined

delete theObj.c;
alert(theObj.c); // undefined

// Laten we kijken welke properties
// er nu nog bestaan!
for(var i in theObj) {
    alert(i + ' ' + theObj[i]);
}
// Alleen theObj.a & theObj.b!
// theObj.c ist verschwunden :)

Verwijderd

Blues schreef het volgende:
var _undef;
theObj.b = _undef;
alert(theObj.b); // undefined
Daar heb je ook gewoon een operator voor :+
code:
1
delete theObj.b;

Deletes a property from an object, or removes an element from an array.

Verwijderd

Op woensdag 24 juli 2002 12:01 schreef Triyazo het volgende:

[..]

Daar heb je ook gewoon een operator voor :+
code:
1
delete theObj.b;

Deletes a property from an object, or removes an element from an array.
Op woensdag 24 juli 2002 10:30 schreef Blues het volgende:
code:
1
2
delete theObj.c;
alert(theObj.c); // undefined
Ik heb mijn post nou speciaal voor mensen als jij geschreven. Als je goed leest, en mijn code uitvoert zul je zien dat
code:
1
2
var _undef;
theObj.c = _undef;

en
code:
1
delete theObj.c;

absoluut niet hetzelfde zijn...

  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

Op woensdag 24 juli 2002 10:30 schreef Blues het volgende:

[..]

Waarom wil je dit? Memory management bestaat niet echt in JavaScript.

[..]
Hoewel memorie managment niet bestaat is het wel gebruikelijk objecten te destroyen zodra je ze niet meer nodig hebt. Of zoals mijn leraar altijd zei
"Always make sure to clean your room before you leave or your momma is gonna get medieval on yo ass.."
;)

"You're only as good, as what you did last week."


Verwijderd

Op woensdag 24 juli 2002 12:21 schreef oh,when? het volgende:Hoewel memorie managment niet bestaat is het wel gebruikelijk objecten te destroyen zodra je ze niet meer nodig hebt.
Ja, dat klopt ook wel maar dat is makkelijker gezegd dan gedaan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
function MyObject( a, b, c ) {
    this.a = a;
    this.b = b;
    this.c = c;
}
var theObj1 = new MyObject(1,2,3);
var theObj2 = theObj1;

theObj1.a = 'Ik besta straks nog';
theObj1 = null; // achter m'n kont opruimen?

alert(theObj2.a); // bestaat nog steeds!

Dat bedoel ik...er bestaat geen mogelijkheid om alle referenties naar een object te deleten...

Verwijderd

dubbelpost

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 10:42
Wil niet spelbrekeren hoor, maar memory management bestaat wel degelijk ik JS... Je objecten rond laten slingeren is niet een goed idee... Een object wordt pas opgeruimd als ALLE referenties erheen weg zijn. Als je 1 referentie laat staan dan blijft ook het object in het geheugen, wat je dus performance scheelt.

Als het goed is moet je in je programma toch een idee hebben welke refs er naar een object zijn. Je weet dus wat wanneer opgeruimd wordt.

Verwijderd

Op woensdag 24 juli 2002 13:29 schreef Morrar het volgende:
Wil niet spelbrekeren hoor, maar memory management bestaat wel degelijk ik JS... Je objecten rond laten slingeren is niet een goed idee... Een object wordt pas opgeruimd als ALLE referenties erheen weg zijn. Als je 1 referentie laat staan dan blijft ook het object in het geheugen, wat je dus performance scheelt.
Loop ik nou in het luchtledige te posten? Dit is toch wat ik in m'n vorige post beschrijf? Tuurlijk bestaat memory management inderdaad in JavaScript, maar het is een manual memory management (m.m.m.) ;)

Het is inderdaad mogelijk om een Object te deleten door alle referenties naar dat object te veranderen, maar dit is toch een behoorlijk lompe manier. Globale variabelen kun je zijn op geen enkele manier te trashen. Het enige wat je kunt doen is undefined of een een of andere (semi-lege) waarde aan ze toekennen.

[breaking news]
Ik kom er net achter dat het in IE wel kan!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function MyObject( a,b,c ) {
    this.a = a;
    this.b = b;
    this.c = c;
}
var theObj = new MyObject(1,2,3);

alert(theObj.a); // 1

// Geen errors:
delete theObj;

// MOZ :[object Object] 
// NS4 :[object Object] 
// IE  :JS-Error
alert(theObj);

// MOZ :1 
// NS4 :1 
// IE  :JS-Error
alert(theObj.a);

[/breaking news]

Verwijderd

Het belangrijkste is dat je lokaal gebruikte variabelen ook lokaal "declareert". Dat doe je dus met het var statement. Block-level scope à-la C++ ken js niet, maar je mag de var op elke plek in je code. Met var geef je in feite aan of een variabele lokaal of globaal is.

Maar: weet iemand ook een website/boek die de taal (dus geen dhtml gedoe) goed beschrijft. Alles wat ik weet heb ik via MSDN/Netscape "references" en view-souce/uitproberen geleerd. Is het echt nodig om ECMA-262 door te nemen?

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 11:17

crisp

Devver

Pixelated

Op donderdag 25 juli 2002 00:48 schreef Doekman het volgende:
Het belangrijkste is dat je lokaal gebruikte variabelen ook lokaal "declareert". Dat doe je dus met het var statement. Block-level scope à-la C++ ken js niet, maar je mag de var op elke plek in je code. Met var geef je in feite aan of een variabele lokaal of globaal is.

Maar: weet iemand ook een website/boek die de taal (dus geen dhtml gedoe) goed beschrijft. Alles wat ik weet heb ik via MSDN/Netscape "references" en view-souce/uitproberen geleerd. Is het echt nodig om ECMA-262 door te nemen?
True; een variabele gedefinieerd zonder 'var' binnen een functie wordt automagisch globaal. Heel slordig dus om dit te doen!
wb je 2e vraag; ik heb tot nog toe genoeg gehad aan de Netscape reference & MSDN en heb nog nooit de ECMA-262 doorgenomen. Voor mij is het belangrijker wat de browsers ondersteunen dan wat de standaard voorschrijft...

Intentionally left blank


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-05 18:53

Bosmonster

*zucht*

Destroyen van objecten is wel degelijk nodig als je bijvoorbeeld IE5 support voor Mac wilt inbouwen. Deze heeft namelijk en bug waarin object-instanties gecached worden. Ik kreeg dus constant foutmeldingen als ik naar andere pagina's ging en de Mac werd trager en trager en liep uiteindelijk vast :D

Simpele destroyAll() method onunload verhielp het hele probleem. Deze deed niks meer als alle zelfgemaakte objecten resetten naar null.

Verwijderd

Op donderdag 25 juli 2002 09:08 schreef Bosmonster het volgende:
Destroyen van objecten is wel degelijk nodig als je bijvoorbeeld IE5 support voor Mac wilt inbouwen. Deze heeft namelijk en bug waarin object-instanties gecached worden. Ik kreeg dus constant foutmeldingen als ik naar andere pagina's ging en de Mac werd trager en trager en liep uiteindelijk vast :D

Simpele destroyAll() method onunload verhielp het hele probleem. Deze deed niks meer als alle zelfgemaakte objecten resetten naar null.
Hmmm, daar moet ik eens goed naar kijken. Mac/IE5 is tot nu toe altijd mijn probleemkindje geweest als het gaat om relatief zware JS-driven pagina's.
Pagina: 1