Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

constructeur/destructeur

19 réponses
Avatar
unbewusst.sein
bon dans un script je crée de nouveaux objets par :

var a=new Ant(...);

quand a a fini son taf, je n'en ai plus besoin, pour détruire cette
objet (*) il me suffit de faire :

a=null;

ça libère de la ram ?

* peut lui-même avoir créé d'autres objets a', a'' etc... MAIS ils
finissent leur boulot avant que a finisse le sien.
--
Une Bévue

9 réponses

1 2
Avatar
Laurent vilday
ben, si j'ai bien compris, le pb de référence circulaire se constate
avec IE seulement... donc je n'ai pas le moyen de tester...


Si c'était aussi simple qu'un problème exclusif à IE. Mais non.

<https://addons.mozilla.org/fr/firefox/addon/2490>
<http://dbaron.org/mozilla/leak-monitor/>

tiens dans le même ordre j'ai commencé un test avec la fonction
isMethod( object, method) proposée par Pointedears sur clj :
<http://thoraval.yvon.free.fr/JS/tests/is_method.xhtml>


Sérieusement ? Tu veux te taper une regex toutes les 5 lignes de code ?
Une regex dès que tu fais un document.getElementById, un window.open, un
Element::focus, etc ? Ta "source", il suffit de suivre clj, n'est pas
connecté avec la réalité. En tant que tel, tous ses écrits/réflexions
sont à prendre/considérer avec de très grandes précautions. Typiquement,
le isMethod() est une horreur.

les refs du post sont dans le fichier :
<http://thoraval.yvon.free.fr/JS/tests/is_method.txt>


function isMethod(o, p)
{
return o && /b(function|object|unknown)b/i.test(typeof o[p])
&& o[p];
}

function poptastic(url, options)
{
if (isMethod(window, "open"))
{
var w = window.open(url, "poptastic", options);
if (isMethod(w, "focus")) w.focus();
}

return !w;
}


Résultat, 2 regex pour faire "window.open" et "w.focus". J'ose même pas
imaginer ce que ça va donner dans quelques temps quand cette horreur
aura envie ton code.

D'autant, que ça sous entend que le navigateur serait capable de faire

/maRegex/.test(typeof monObjet)

mais serait incapable de faire

window.open ou w.focus ?

Sérieusement ? Dans quelle réalité ce genre de chose serait possible
*et* serait à prendre en considération ?

--
laurent

Avatar
Laurent vilday
SAM wrote:
mais qq me choque : dans mon cas j'ai besoin d'initialiser l'objet en
question (ie. déplacé la "tortue"/"fourmi" à ses coordonnées initiales.

dans la version actuelle en closure, je fais ça comme ça :

function Ant(...){
[...]
var that=this;
function init(){
that.ctx.moveTo(that.x,that.y);
that.penDown();
}
init();
}

l'intérêt est que je n'ai pas à faire un init sur une instance.


Rien compris, comment ce serait "un init sur une instance" ?

Mais pourquoi pas simplement ceci :

function Ant(...)
{
...
function init(that)
{
that.ctx.moveTo(that.x, that.y);
that.pendDown();
return that;
}
return init(this);
}

mais en passant à prototype, avec :

var Foo = function(){};

je fais comme d'hab ?
càd :

j'initialise les attributs de l'objet :

function UnObjet(attribut_1,...,attribut_n){
this.attribut_1=attribut_1;
...
this.attribut_n=attribut_n;
var that=this;
function init(){...}
init();
}

puis :
UnObjet.prototype.uneFonction=function(params){...; return this;};


Quoi ? quoi ? quoi ? Pourquoi continuer avec le that=this si tu veux
prototyper tout ça ?

function UnObjet(attribut_1, ...)
{
this.attribut_1 = attribut_1;
...
return this.init();
}

UnObjet.prototype.init = function()
{
this.ctx.moveTo(this.x, this.y);
this.pendDown();
return this;
};

donc seules les functions sont "externalisées" par prototypes...


Pourquoi je comprends rien à ce que tu racontes ? :(

je pense que le "that" dans init() ne fabrique pas de cycle (?)


Ben si, et encore, sous condition que je comprenne ce que tu entends par
"cycle".

Reprenons ton exemple d'origine :

function UnObjet(attribut_1,attribut_n)
{
this.attribut_1=attribut_1;
this.attribut_n=attribut_n;
var that=this;
function init()
{
that.doSomething();
}
init();
}

Dans le contexte "UnObjet",
"init" est une Variable (si si)
"that" est une Closure

Puis dans init()
"that" est une Outer variable

Donc si, le "cycle" dont tu parlais existe bel et bien.

j'ai bon, ou je n'ai rien compris au film ???


A priori c'est pas bon, mais je t'avoues je comprends pas la moitié de
ce que tu dis ni de ce que tu veux faire. Donc peut être :D

--
laurent

Avatar
unbewusst.sein
Laurent vilday wrote:

Mais pourquoi pas simplement ceci :

function Ant(...)
{
...
function init(that)
{
that.ctx.moveTo(that.x, that.y);
that.pendDown();
return that;
}
return init(this);
}



ah ouais! fastoche !!!


donc seules les functions sont "externalisées" par prototypes...



je veux dire par là que les attributs sont gardés dans le corps du
constructeur standard donc, et que les méthodes sont définies de manière
externe au constructeur en utilisant prototype.

Pourquoi je comprends rien à ce que tu racontes ? :(

je pense que le "that" dans init() ne fabrique pas de cycle (?)


Ben si, et encore, sous condition que je comprenne ce que tu entends par
"cycle".

Reprenons ton exemple d'origine :

function UnObjet(attribut_1,attribut_n)
{
this.attribut_1=attribut_1;
this.attribut_n=attribut_n;
var that=this;
function init()
{
that.doSomething();
}
init();
}

Dans le contexte "UnObjet",
"init" est une Variable (si si)
"that" est une Closure

Puis dans init()
"that" est une Outer variable

Donc si, le "cycle" dont tu parlais existe bel et bien.

j'ai bon, ou je n'ai rien compris au film ???



ta solution est bien meilleure que la mienne c'est sûr, je ne crois pas
que le pb soit du à une closure mais à un cycle càd à un élément défini,
indirectement à lui-même ce qui crée une boucle infinie (par référence
circulaire). mais peut-être que le mot "closure" est utilisé dans deux
sens différents???


--
Une Bévue


Avatar
unbewusst.sein
Laurent vilday wrote:

Résultat, 2 regex pour faire "window.open" et "w.focus". J'ose même pas
imaginer ce que ça va donner dans quelques temps quand cette horreur
aura envie ton code.


ben de toutes façons entre son code et ce que j'ai du écrire il y a une
différence, le mien marche, pas le sien, son code ne retourne même pas
une valeur booléenne mais la fonction, littéralement...

j'ai fait l'essai et j'ai laissé tombé...

tu confirmes, merci !
--
Une Bévue

Avatar
unbewusst.sein
SAM wrote:


C'est super bien fait mais pourquoi ça a tant de mal à s'ouvrir ?


ça dépend du contenu du dossier, il peut y avoir + de 1000 DIVs...
une div par fichier/dossier à visualiser.
--
Une Bévue

Avatar
SAM
SAM wrote:

C'est super bien fait mais pourquoi ça a tant de mal à s'ouvrir ?


ça dépend du contenu du dossier, il peut y avoir + de 1000 DIVs...
une div par fichier/dossier à visualiser.


Ça osculte les répertoires pour en faie un menu, non?
C'est tout en XML ?
ou bien c'est du PHP ?

--
sm


Avatar
unbewusst.sein
SAM wrote:

Ça osculte les répertoires pour en faie un menu, non?
C'est tout en XML ?
ou bien c'est du PHP ?


ni l'un ni l'autre ;-)

c'est un script ruby qui crée les scripts js et les répertoires
associés.

ce n'est pas sur mon site si tu le souhaites je te l'envoie par mail.

il s'appelle treemap il s'utilise depuis un sous-répertoire de ~/Sites,
par exemple :
~~/Sites/DOM

on entre treemap et c'est tout.

il fait un peu moins de 300 lignes et nécessite un répertoire d'image
(les extensions) une feuille css.

accessoirement il crée le script du menu à droite "menu.js"
--
Une Bévue

Avatar
SAM
SAM wrote:

Ça osculte les répertoires pour en faie un menu, non?
C'est tout en XML ?
ou bien c'est du PHP ?


ni l'un ni l'autre ;-)

c'est un script ruby qui crée les scripts js et les répertoires
associés.


Alors ça ne fonctionne pas chez Free.fr, si ?

ce n'est pas sur mon site si tu le souhaites je te l'envoie par mail.


OK

il s'appelle treemap il s'utilise depuis un sous-répertoire de ~/Sites,
par exemple :
~~/Sites/DOM

on entre treemap et c'est tout.


Où est mon entonnoir ?
(j'entre ça où ?)

Bon il doit il y avoir un readme avec les 300 lignes :-)

--
sm


Avatar
unbewusst.sein
SAM wrote:

c'est un script ruby qui crée les scripts js et les répertoires
associés.


Alors ça ne fonctionne pas chez Free.fr, si ?


si si, regardes, par ex :
<http://thoraval.yvon.free.fr/XML/treemap.xhtml>
(un des + légers)

tu pourras piquer sur mon site (free) les images utiliées :

http://thoraval.yvon.free.fr/com/ext // extension de fichiers
http://thoraval.yvon.free.fr/com/tree // images de la page

la feuille css est dans :

http://thoraval.yvon.free.fr/com/css

en bref, tout ce qui est en *commun* est dans ce répertoire "com".


ce n'est pas sur mon site si tu le souhaites je te l'envoie par mail.


OK

il s'appelle treemap il s'utilise depuis un sous-répertoire de ~/Sites,
par exemple :
~~/Sites/DOM

on entre treemap et c'est tout.


Où est mon entonnoir ?
(j'entre ça où ?)


ah, ça marche au terminal hein...


Bon il doit il y avoir un readme avec les 300 lignes :-)


mon code n'est pas du tout commenté, mais bon le nom des variables, ça
aide.

de plus, ce n'est pas testé-utilisé avec le ruby Apple, mais bon, ça
n'utilise aucun module/classe suplémentaire.

pour faire un essai, tu crées un répertoire bidon dans ton ~/Sites, avec
quelques pages et dossiers.

to ouvres l'application Terminal (dans le dossier
/Applications/Utilitaires)

quand Terminal.app est lancé, tu glisse dans sa fenêtre le dossier bidon

tu entre au clavier return ou enter

le shell est alors positionné dans ton dossier bidon.

reste à lancer le script

là, toujours dans Terminal.app tu entres :

ruby
(avec un blanc après le y)

ensuite, comme pour le dossier bidon, tu glisses le fichier treemap (qui
était par exemple sur ton Bureu) dans la fenêtre de Terminal.app

là le path s'affiche tu devrais avoir une ligne du genre :

ruby /Users/sam/Desktop/treemap

(avec d'autres caractères en début de ligne : le prompt)

là tu entre return ou enter et tu regardes ce qui se passe.

normalement le script produit dans le dossier bidon deux sous-dossiers :
menus
qui contient menu.js

et

treemap_rep
qui contient ls.js et preload.js

et un fichier directement dans le répertoire bidon :
treemap.xhtml

le script envoie quelques messages à Terminal.app disant ce qu'il a
fait.

si tout se passe bien le fichier treemap.xhtml est ouvert, à la fin du
script, dans le navigateur par défaut.

bon il est possible que cette ouverture ne marche pas chez toi car sur
ma bécanne j'ai configuré Apache 2 de telle manière que le root du site
soit à ~/Sites et adressé par http://127.0.0.1/

(pas de ~yt, yt étant mon login short name)

--
Une Bévue


1 2