Syntaxe Etrange

Résolu
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 - 2 avril 2008 à 11:50
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 - 2 avril 2008 à 21:50
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

Zobibol Messages postés 469 Date d'inscription mercredi 9 janvier 2002 Statut Membre Dernière intervention 20 février 2017 6
2 avril 2008 à 16:41
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]
3
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
2 avril 2008 à 21:46
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.
3
XtremDuke Messages postés 626 Date d'inscription samedi 28 septembre 2002 Statut Membre Dernière intervention 18 mai 2009 4
2 avril 2008 à 14:13
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 ?
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
2 avril 2008 à 14:18
Salut:

Il parait qu'il s'agit de la déclaration d'une classe abstraite.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
2 avril 2008 à 14:21
Salut:

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

Mais c'est un exemple que j'ai lu sur le site de Extjs.
0
Zobibol Messages postés 469 Date d'inscription mercredi 9 janvier 2002 Statut Membre Dernière intervention 20 février 2017 6
2 avril 2008 à 16:02
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]
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
2 avril 2008 à 16:33
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.
0
Zobibol Messages postés 469 Date d'inscription mercredi 9 janvier 2002 Statut Membre Dernière intervention 20 février 2017 6
2 avril 2008 à 16:49
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]
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
2 avril 2008 à 21:50
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.
0
Rejoignez-nous