Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/12/2011, 13h45   #1
Membre régulier
 
Inscription : novembre 2009
Messages : 77
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 77
Points : 75
Points : 75
Par défaut prototype attribute et prototype property

L'attribut prototype n'est pas la propriété prototype même si les deux ne sont pas toujours distinctement présentés dans les livres/tutoriels javascript.
Ou en tout cas que je n'étais pas assez malin pour capter la nuance au premier coup d'oeil.
Du coup forcément je me demandais pourquoi ce coup tordu avec les constructeurs si on veut simplement que le prototype de x soit y, pourquoi ne pas simplement faire x.prototype = y ??
Bon, le franc est tombé, la lumière fût, et les bouquins javascript avancés deviennent de douces mélodies.

Ce post parce que pour asseoir la compréhension j'ai fait un petit code qui illustre bien (je trouve) le propos et que je pense (naïvement?) qu'il peut en aider d'autres:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<!DOCTYPE html>
 
<head>
 
<SCRIPT>
"use strict";
 
function startup(){
 
  var theConstructor = function() {};
  var parent = {toString: function() {return "parent";}};
  theConstructor.prototype = parent;
  var falseChild = {};
  falseChild.prototype = parent;
  var trueChild = new theConstructor();
 
  document.getElementById("display").innerHTML =
 
    "Object.getPrototypeOf(falseChild).toString() : " + Object.getPrototypeOf(falseChild).toString() + "<p>" + 
 
    "falseChild.prototype.toString() : " + falseChild.prototype.toString() + "<p>" + 
 
    "falseChild.toString() : " + falseChild.toString() + "<p>" + 
 
    "Object.getPrototypeOf(trueChild).toString() : " + Object.getPrototypeOf(trueChild).toString() + "<p>" + 
 
    "trueChild.prototype.toString() : " + (trueChild.prototype && trueChild.prototype.toString()) + "<p>" + 
 
    "trueChild.toString() : " + trueChild.toString() + "<p>" + 
 
    "Object.getPrototypeOf(theConstructor).toString() : " + Object.getPrototypeOf(theConstructor).toString() + "<p>" + 
 
    "theConstructor.prototype.toString() : " + theConstructor.prototype.toString() + "<p>" + 
 
    "theConstructor.toString() : " + theConstructor.toString() + "<p>" + 
 
    "";
  }
 
</script>
 
</head>
 
<body onload="startup()">
 
<div id="display">
</div>
 
</body>
 
</html>
frfancha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 14h56   #2
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 808
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 808
Points : 35 787
Points : 35 787
Citation:
L'attribut prototype n'est pas la propriété prototype


C'est quoi pour toi l'attribut prototype ?
Autant, la propriété, je comprends, tout, en JavaScript est objet et chaque objet hérite d'un (ou plusieurs) prototype, mais "l'attribut prototype", là, vraiment, je vois pas de quoi tu parles...
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 15h38   #3
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 872
Points : 1 381
Points : 1 381
pareil que Bovino, je ne comprend pas tout dans ton post, pas même s'il y a une question ou s'il s'agit d'un partage de code ?

aussi tu sembles pas mal t’emmêler les pinceaux.


Code :
1
2
var falseChild = {};
falseChild.prototype = parent;
un objet n'est pas censé avoir de prototype, c'est le constructeur qui possède un prototype pour que les objets instanciés par celui-ci héritent de ses propriétés. (certains navigateurs regroupent ces propriété ainsi héritées dans l'attribut "__proto__" de l'objet)
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 15h47   #4
Membre régulier
 
Inscription : décembre 2007
Messages : 61
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 61
Points : 83
Points : 83
Oui, le prototype (la propriété interne [[prototype]]) ne peut être attribué "manuellement".

Tu dois mettre ton prototype en valeur de la propriété "prototype", et à l'instanciation, le runtime vérifiera si tu as mis un objet dans la propriété "prototype" et si oui, le mettra en valeur de la propriété inter interne [[prototype]].

L'algorithme d'instanciation est grosso modo un appel à la méthode interne [[construct]] décrite ainsi dans la norme :

Citation:
13.2.2 [[Construct]]
When the [[Construct]] property for a Function object F is called, the following steps are taken:
1. Create a new native ECMAScript object.
2. Set the [[Class]] property of Result(1) to "Object".
3. Get the value of the prototype property of the F.
4. If Result(3) is an object, set the [[Prototype]] property of Result(1) to Result(3).
5. If Result(3) is not an object, set the [[Prototype]] property of Result(1) to the original Object
prototype object as described in 15.2.3.1.

6. Invoke the [[Call]] property of F, providing Result(1) as the this value and providing the argument
list passed into [[Construct]] as the argument values.
7. If Type(Result(6)) is Object then return Result(6).
8. Return Result(1).
A noter que sous des version de firefox (pas les dernières) et sous Rhino, tu peux accéder directement à la propriété interne [[prototype]] via la propriété non-standard __proto__.
TheGwy est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/12/2011, 15h59   #5
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 872
Points : 1 381
Points : 1 381
Citation:
Envoyé par TheGwy Voir le message
7. If Type(Result(6)) is Object then return Result(6).
8. Return Result(1).
J'en apprend à chacun de tes posts.


J'avais déjà eu affaire à des codes où le constructeur renvoyait un autre objet que le "this" (généré par le "new") et ça fonctionnait très bien.

Par contre j'ignorais qu'il était impossible de renvoyer une primitive. (string, number, etc..)




je me suis fais un petit code de test :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
// --- SAMPLE 1 ---
function A(){
	return {v:1}; // return a new object
}
var a = new A();
alert(a instanceof A); // FALSE
 
// --- SAMPLE 2 ---
function B(){
	return 1; // returning a primitive value is forbidden -> THIS object is returned
}
var b = new B();
alert(b instanceof B); // TRUE
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 16h17   #6
Membre régulier
 
Inscription : novembre 2009
Messages : 77
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 77
Points : 75
Points : 75
Citation:
Envoyé par Bovino Voir le message

C'est quoi pour toi l'attribut prototype ?
Autant, la propriété, je comprends, tout, en JavaScript est objet et chaque objet hérite d'un (ou plusieurs) prototype, mais "l'attribut prototype", là, vraiment, je vois pas de quoi tu parles...
Justement l'attribut prototype d'un objet c'est "son" prototype au sens de l'héritage prototype de l'objet tandis que la propriété prototype d'un objet c'est une propriété comme une autre qui n'a pas de lien avec l'héritage.

J'utilise le terme attribut au sens du javascript definitive guide:
tout objet a 3 attributs: -extensible -prototype et -class.
frfancha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 16h22   #7
Membre régulier
 
Inscription : novembre 2009
Messages : 77
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 77
Points : 75
Points : 75
Citation:
Envoyé par Willpower Voir le message
pareil que Bovino, je ne comprend pas tout dans ton post, pas même s'il y a une question ou s'il s'agit d'un partage de code ?
Aucune question, c'est juste un partage, pour ceux qui veulent, si c'est inintéressant pour toi parce que tu es plus avancé, pas de soucis.
Citation:
Envoyé par Willpower Voir le message
aussi tu sembles pas mal t’emmêler les pinceaux.
Plus maintenant heureusement.
Citation:
Envoyé par Willpower Voir le message
un objet n'est pas censé avoir de prototype
Rien ne l'empêche.
Citation:
Envoyé par Willpower Voir le message
c'est le constructeur qui possède un prototype
Le constructeur est un objet aussi.
frfancha est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h50.


 
 
 
 
Partenaires

Hébergement Web