|
Bas de page | |
---|---|
Auteur | Sujet : [JavaScript]Question au sujet de l'augmentation d'un objet |
Ummon | Bonjour,
Message cité 1 fois Message édité par Ummon le 17-07-2008 à 13:27:22 |
Publicité | Posté le 17-07-2008 à 13:26:57 |
gebruik | On parle de méthode, pas de fonction.
|
masklinn í dag viðrar vel til loftárása |
--------------- Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody |
Ummon |
Message cité 1 fois Message édité par Ummon le 17-07-2008 à 23:37:18 |
mIRROR Chevreuillobolchévik |
pourtant, le JS est naturellement orienté objet....
par contre sur ce coup je suis completement a l ouest et masklinn n hesitera pas a me rectifier, mais j ai toujours pensé que
Message édité par mIRROR le 18-07-2008 à 03:54:42 --------------- « The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell |
0x90 → | non, object.method c'est pas pareil que object.prototype.method Quand on fait a.foo pour trouver foo le résolveur va chercher d'abord dans a, et ensuite dans a.prototype s'il trouve pas dans a (et il continuera de la même manière s'il trouve pas dans a.prototype, jusqu'à tomber sur object). Quand on fait un "b = new a()", le prototype du nouvel objet "b" sera l'objet nommé "a", du coup le new ne "coute" que la construction d'un objet vide. Par contre, quand on fait un appel de méthode, il doit faire 2 recherches, d'abord dans b, puis dans a, pour trouver la méthode. Si tu crée un objet vide et que tu copie les méthodes à la main, la fabrication de l'objet est bcp plus couteuse, il faut vraiment construire chaque méthode, par contre l'appel est un poil plus rapide en théorie (je parierais pas dessus). Et le compilo ne peut pas deviner qu'une fonction est toujours la même, on peut jamais vraiment garantir que ce soit vrai, un with par exemple peut irrévocablement changer le code de la fonction au moment de l'execution du constructor, différemment de s'il est employé lors de l'appel de la fonction construite :
Et même sans ce genre de trucs tordus, les compilos js sont pas vraiment des exemples de haut niveau d'optimisation dans le genre (ça s'améliore grandement récemment cela dit, les trucs déconseillés maintenant seront peut-être normaux plus tard quand on aura la garantie d'un minimum d'intelligence du compilo, comme ça peut être le cas en c++ pour l'inlining agressif par exemple).
Message cité 1 fois Message édité par 0x90 le 18-07-2008 à 05:28:18 --------------- Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck. |
mIRROR Chevreuillobolchévik | oula j ai plein de questions
--------------- « The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell |
0x90 → | Bon, on va faire un peu de dissection, ça sera plus facile à comprendre. On va imaginer qu'on code un interpréteur javascript en ... java, un objet "dans le monde du javascript" serait représenté dans le monde du java par quelque chose du genre :
En php, l'équivalent serait en gros :
le JSObject appelé lePrototypeDeObject est modifié pour ne pas avoir de prototype, donc dans getOperateurPoint, le else balance une exception "J'ai pas trouvé le membre demandé". Maintenant, quand dans du JS tu fait : B = new A(); ton interpreteur va faire (j'explique après ce qu'est "unEndroit", disons que c'est la liste des variables globales pour l'instant) : unEndroit["B"] = new JSObject(unEndroit["A"]); A.prototype est donc le prototype de B. Il faut bien distinguer prototype le membre de l'objet qu'on peut modifier à la main, et prototype la propriété interne à laquelle on peut pas vraiment toucher sauf via ce qui se passe pendant le new. (j'avais zappé ça tout à l'heure... pas bon du tout.) maintenant si dans du JS tu as : B.foo dans l'interpréteur il va faire : unEndroit["B"].getOperateurPoint("foo" ); Et là tu peut aller lire le code de la classe pour voir ce qu'il se passe, et quelle est la différence entre avoir la méthode enregistrée dans les membres direct de B, ou dans les membres du prototype de B (en l'occurence A.prototype), et laquelle il va choisir sur la méthode est enregistée aux 2 endroits. Et détail, quand tu fais : A.foo.bar.baz = D; il va faire un getOperateurPoint pour accéder à A.foo puis A.foo.bar, mais va utiliser setOperateurPoint pour modifier A.foo.bar.baz dans A.foo.bar et y mettre D. Enfin le with, c'est tout simple, c'est un truc qui modifie "unEndroit". par défaut, unEndroit c'est l'objet qui corresponds à "window" (dans un navigateur web, en flash ça sera root ou si je me trompe pas). quand tu fais : Ce qui se passait dans le code que j'ai montré avant, c'est que pendant l'exécution de constructor qui est dans un with (l'objet b), il va aller chercher print en premier dans foo, il va le choisir, et ne va pas regarder le print global du tout. Message cité 1 fois Message édité par 0x90 le 18-07-2008 à 07:32:10 --------------- Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck. |
mIRROR Chevreuillobolchévik |
--------------- « The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell |
0x90 → |
--------------- Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck. |
Publicité | Posté le 18-07-2008 à 08:33:20 |
Shinuza This is unexecpected | Avant tous pour ceux qui ne les ont pas vu, je ne saurais que trop vous conseiller : Il faut savoir qu'en javascript, les types primitifs sont passés par valeur et les objets "complexes" par référence, les fonctions étant des objets : Code de test :
Le principe de base de l'objet c'est d'avoir une usine de base, qui est faite pour créer un type d'objet.
Maintenant, sachant ça on peut faire quelque chose de très simple pour vérifier le comportement du code d'Ummon :
Les tests 2 et 3 vérifient ce qu'on connait déja, par contre le test 1 semble créer un objet différent, pourquoi? Simplement parce que dans le premier listing "o" est déclaré comme une variable propre à la methode "m", elle est donc détruite et crée à chaque execution de "constructor". Donc Ummon, pour répondre à ta question, non, la methode m dans ton code n'est pas la même entre a et b. Ps: Pour faire tourner le code dans firebug :
Message cité 2 fois Message édité par Shinuza le 18-07-2008 à 09:05:11 --------------- Mains power can kill, and it will hurt the entire time you’re dying from it. |
Ummon |
|
0x90 → |
--------------- Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck. |
Shinuza This is unexecpected |
--------------- Mains power can kill, and it will hurt the entire time you’re dying from it. |
Sujets relatifs | |
---|---|
[Javascript] Problème simple de syntaxe ! | Javascript: getDay() souffre-t-il du décalage horaire ? |
question simple, difference entre deux classes CSS | erreur javascript "objet attendu" |
filezilla question très noob | Javascript dans pages HTML je suis POMER |
Un site en ajax et les fonctions javascript ? | [DOTNET] ArrayList d'OBJET -> Supprimer doublons |
question dans vbnet | |
Plus de sujets relatifs à : [JavaScript]Question au sujet de l'augmentation d'un objet |