Forum Programmation.web [Javascript] derivation du prototype d'un objet HTML

Posté par  (site web personnel) .
Étiquettes :
0
29
sept.
2005
je fais mumuse avec du JS et entre autre avec de l'héritage de prototype et Mozilla Deer-Park beta 1 ( probleme reproductible sur Safari, FireFox et consort ).

pour faire qu'une classe JS herite d'une autre classe JS, il faut que l'attribut prototype de la classe fille soit une instance de la classe mere ( ou le prototype de cette instance si necessaire ).

mon probleme vient quand je souhaite faire un objet JS qui derive d'un element HTML.

soit la classe
function maclasse () { }


si je fais :
maclasse.prototype = document.createElement( "a" );

j'ai tjr la meme instance parente ce qui fait que je n'ai qu'un seul objet apparent.


si je fais
maclasse.prototype = document.createElement( "a" ).prototype;

maclasse ne dispose plus de prototype.


si je fais
maclasse.prototype = new Link();

la classe Link n'existe pas qui pourtant est une classe standard depuis le debut du Javascript "client side" ( et non "core" ).


si je fais
maclasse.prototype = HTMLAnchorElement.prototype;

"Illegal operation"


si je fais
maclasse.prototype = new HTMLAnchorElement();

"cannot be created in this context"



j'ai la vague intuition :
- qu'il faille regarder du coté de apply() / call() de la classe Function
- qu'il faille aussi creuser du coté HTMLElement / HTMLAnchorElement
mais je ne vois pas comment faire

en gros, je dois m'y prendre comme un manche pour ce que je veux faire.

de plus, et avant toute condescence sur ce point, toute reference a javascript, HTML, inheritance, prototype, HTMLElement fourni son lot de qq millier de pages sur google, ce qui rend la recherche d'autant plus hardu.

je me pose la meme question pour XHTML, mais je n'ai pas encore essayé avec.
  • # Pas possible ?

    Posté par  . Évalué à 1.

    Ce qui suis n'est qu'une intuition personnelle, mais je ne vois pas comment tu peux créer un élément spécifique : en effet comment le moteur ferait la différence avec un élément DOM "classique" ? (par exemple, tu fais createElement("a"), comment tu fais createElement("mya") ?). Ce qui explique que le fonctionnement classique (maclasse.prototype = new HTMLAnchorElement() pour moi) n'est pas autorisé.

    L'attribut "prototype" d'une classe javascript n'a rien de magique : c'est une simple table de hash contenant les attributs et les méthodes d'une classe. L'héritage n'est alors qu'une copie des éléments de cette table.

    Je te conseille de jeter un coup d'oeil du côté des frameworks javascript (http://prototype.conio.net/ par exemple, et http://mochikit.com/ encore mieux).

    Le mieux serait de savoir ce que tu veux rééllement faire. Si c'est simplement rajouter une fonctionnalité à la balise a, tu peux facilement faire :

    HTMLAnchorElement.prototyope.myfunc = function () {
    [...]
    }

    --
    Thomas
    • [^] # Re: Pas possible ?

      Posté par  (site web personnel) . Évalué à 2.

      donc le X de XHTML c comme le deuxieme i de hawaii ?

      parce que si l'on ne peut pas spécialiser un tag ( comme HTMLAnchorElement qui existe sous deux forme, ou Input qui existe sous plein de forme ) sans tout redevelopper, ses objets ne servent a rien.

      Avant, j'avais une classe conteneur d'abstraction des HTMLElement qui pouvait se spécialiser avec des conteneurs spécifiques.

      je voulais simplement agrementé mes HTMLElement de comportements differents selon les ev standards en fonction des informations dont je dispose.

      comme l'utilité de la chose est pour une page qui ne sera pas vu de google, il n'y aura que du JS, et faire un new dndAnchor( document ) n'est pas d'une grande complexité.

      bon, en y reflechissant, si je veux me debrouiller malgré cela, il faut que je puisse etendre les actions d'un HTMLElement. donc le plus simple, est d'avoir des pools par objets instancié avec des eventHandler generique qui vont consulter les pools.

      l'idee de syntaxe serait :
      var mon_anchor = document.createElement( "a" );
      mon_anchor.is( dndable );

      avec des contenaires qui, eux, peuvent etre des "dropzone" et/ou "dragzone".

      c une sorte d'heritage multiple sans en etre.

      mais cela me complique les choses puisque mon but était d'integrer mon systeme de déclaration anonyme de classe JS ( un peu comme du JSON mais avec des choses en plus dont l'heritage ( et sa resolution ) et fonctionnant aussi avec un eval ).
      • [^] # Re: Pas possible ?

        Posté par  . Évalué à 1.

        donc le X de XHTML c comme le deuxieme i de hawaii ?

        XHTML et JavaScript sont 2 choses bien distinctes. Et puis ce n'est pas le I c'est le H :).

        parce que si l'on ne peut pas spécialiser un tag ( comme HTMLAnchorElement qui existe sous deux forme, ou Input qui existe sous plein de forme ) sans tout redevelopper, ses objets ne servent a rien.

        Mouais. Je n'ai pas dit que c'était impossible, j'ai dit que ce n'était pas le plus simple. Tu sembles vouloir faire du Drag&Drop, et ce n'est pas la solution employé par la plupart de bibliothèques. Je te conseille vivement de regarder ce qui existe pour avoir une idée des possibilités.

        En vrac : Prototype, Scriptaculous, MochiKit, Dojo, sont d'excellents exemples (chacun avec ses avantages et ses inconvénients). Et par exemple Prototype a une fonction d'héritage (qui posait qq problème mais qui peut t'éclairer).

        --
        Thomas

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.