Syntaxe Etrange [Résolu]

Signaler
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
-
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
-
Salut:


J'ai un bout de code:

function X() {

    this.init();

}


Lorsque j'instancie la fonction/classe X Firebug m'affiche une erreur:

X.init is not a method


Je me demande si init est vraimant une méthode vide?

Ou bien une sorte de méthode "abstraite"?


 En effet, lorsque je rend X une classe fille d'une autre classe Y ayant une méthode init(), tout passe bien.

function Y() {

    this.init = function() {

       alert("Y::init()");

    };

}


function X() {

    this.init();

}

X.prototype = new Y();


// Tout passe bien

var x = new X();


// La méthode init() est évoquée deux fois.

x.init();


Avez vous des explications concernant la syntaxe utilisée pour déclarée init dans la classe X?


Merci.

9 réponses

Messages postés
469
Date d'inscription
mercredi 9 janvier 2002
Statut
Membre
Dernière intervention
20 février 2017
5
oui c'est normal qu'elle soit executée deux fois ta méthode je m'explique :
var x = new X();
ceci fait afficher la première popup, mais pourquoi me demanderas-tu ;o)

simplement parce que tu as définit

function X() {
    this.init();
}

le fait de faire un new X() instancie donc ta méthode (c'est space mais bon),
or, l'interpreteur considère que tout ce qui est dans la méthode X() fait partit du constructeur.
ainsi, lors de l'interprétation de new X(), il execute le contenu de la méthode X (notament init()).

je ne sais pas si c'est assez clair !
j'avoue avoir eu du mal à appréhender au début cette syntaxe mais cela ouvre des portes non négligeable au possiblité qu'offre JavaScript.

[o-_-o]
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut:

Désolé pour le dérrangement mes amis.

Il s'avère que j'ai fait une grosse erreur, vu que dans la déclaration:

function X() {
    this.init();
}

on fait juste un appel à la méthode init() qui sera héritée par la suite d'une autre classe.

Merci beaucoup pour votre coopération.
Messages postés
626
Date d'inscription
samedi 28 septembre 2002
Statut
Membre
Dernière intervention
18 mai 2009
3
Salut,

Pourquoi ton objet X est instancié par init ? S'il hérite du modèle de Y, tu n'as pas besoin de redefinir la fonction init() dans X.
Tu cherches à faire quelque chose de précis ?
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut:

Il parait qu'il s'agit de la déclaration d'une classe abstraite.
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut:

J'ai fait le même raisonnement que toi.

Mais c'est un exemple que j'ai lu sur le site de Extjs.
Messages postés
469
Date d'inscription
mercredi 9 janvier 2002
Statut
Membre
Dernière intervention
20 février 2017
5
Bonjour, pourrais tu préciser ce que tu entends par
" Avez vous des explications concernant la syntaxe utilisée pour déclarée init dans la classe X?"
tu veux surclasser la méthode init de Y dans X ?

un petit exemple

    function Y() {
                this.init = function() {
                   return "appel de la méthode init() de Y";
                };
            }

            function X() {
                this.init= function (){
                        // this.__proto__.init() appel la méthode init de la classe mère
                        var ret = "appel de la méthode init() de X " + this.__proto__.init();
                        alert(ret);
                };
            }
            X.prototype = new Y();

       
        function testX(){
               
                // Tout passe bien
                var x = new X();
               
                // La méthode init() est évoquée une
fois.
                x.init();
               
        }

[o-_-o]
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut:

Zobibol >> Je vais reformuler ma question:

function X() {
    this.init();
}

Je me demande pourquoi utilises-t-on cette syntaxe?

Normalement, je me suis habitué à voir la déclaration d'une méthode ou d'un attribut, mais celle-ci me semble totalement différente.

Exécutes mon code et tu vois voir que la méthode init() est appelée deux fois.
Messages postés
469
Date d'inscription
mercredi 9 janvier 2002
Statut
Membre
Dernière intervention
20 février 2017
5
Voilà après un peu de nicotine dans le poumon, un exemple un peu plus "parlant"

function PourTest(){
    this.showMessage = function (_message){
        alert (_message);
    }
}

function PourTestMessage(){
    this.showMessage("instance (new PourTestMessage())");
}

PourTestMessage.prototype = new PourTest();

var message  = new PourTestMessage();

message.showMessage("instance ok");

il va donc y avoir deux message :
le premier : "instance (new PourTestMessage())" appelé lors du new PourTestMessage();
et le second "instance ok" appelé lors du message.showMessage("instance ok");
et voilà donc l'origine des deux popup !

[o-_-o]
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut:

"j'avoue avoir eu du mal à appréhender au début cette syntaxe mais cela
ouvre des portes non négligeable au possiblité qu'offre JavaScript."

C'est ça le gros problème, il faut s'habituer aux mécanismes de JavaScript. Si quelque chose n'est pas déclarée, tu peux le faire par la suite.

Après tout, c'est une lesson à apprendre.