L'utilisation de "prototype" par rapport aux " cela en JavaScript?
Quelle est la différence entre
var A = function () {
this.x = function () {
//do something
};
};
et
var A = function () { };
A.prototype.x = function () {
//do something
};
connexes: la Définition de méthodes via prototype vs l'utilisation de ce dans le constructeur - vraiment une différence de performance?, et de bonnes réponses sur les doublons: Déclarant méthode dans le constructeur ou sur le prototype, ce vs prototype
le concept de CE mot-clé est expressément précisé ici scotch.io/@alZami/understanding-this-in-javascript
La lecture de "ce" thread montre combien horrible est JS et combien ses principes ne sont pas claires à de nombreux développeurs. Précisément ce qui est erroné avec plus facile à comprendre pour les langues? Je pense qu'il est temps aux développeurs de faire entendre leur voix pour rejeter confusion des technologies qui ne servent à rien ou de peu de valeur pour les affaires ou pour le travail de développement.
Sur l'objet:
le concept de CE mot-clé est expressément précisé ici scotch.io/@alZami/understanding-this-in-javascript
La lecture de "ce" thread montre combien horrible est JS et combien ses principes ne sont pas claires à de nombreux développeurs. Précisément ce qui est erroné avec plus facile à comprendre pour les langues? Je pense qu'il est temps aux développeurs de faire entendre leur voix pour rejeter confusion des technologies qui ne servent à rien ou de peu de valeur pour les affaires ou pour le travail de développement.
Sur l'objet:
a1.x !== a2.x
; sur le prototype: a1.x === a2.x
OriginalL'auteur sw234 | 2008-11-22
Vous devez vous connecter pour publier un commentaire.
Les exemples ont des résultats très différents.
Avant de regarder les différences, les points suivants doivent être notés:
[[Prototype]]
propriété.myObj.method()
) puis ce à l'intérieur de la méthode références de l'objet. Où ce n'est pas définie par l'appel ou par l'utilisation de lier, la valeur par défaut de l'objet global (de la fenêtre dans un navigateur) ou en mode strict, reste indéfini.Voici donc les extraits de code en question:
Dans ce cas, la variable
A
est affectée une valeur qui est une référence à une fonction. Lorsque cette fonction est appelée à l'aide deA()
, la fonction de ce n'est pas défini par l'appel, afin que la valeur par défaut de l'objet global et l'expressionthis.x
est efficacewindow.x
. Le résultat est qu'une référence à l'expression de fonction sur le côté droit est affecté àwindow.x
.Dans le cas de:
quelque chose de très différent se produit. Dans la première ligne, la variable
A
est attribué une référence à une fonction. En JavaScript, toutes les fonctions, les objets ont une prototype propriété par défaut, il n'y a pas de code pour créer un A. prototype objet.Dans la deuxième ligne, A. prototype.x est attribué une référence à une fonction. Cela va créer un x propriété si elle n'existe pas, ou assigner une nouvelle valeur si elle n'. Donc, la différence avec le premier exemple dans lequel l'objet x propriété est impliqué dans l'expression.
Est un autre exemple ci-dessous. Il est similaire à la première (et peut-être ce que tu voulais dire à propos de):
Dans cet exemple, le
new
opérateur a été ajouté avant l'expression de fonction, de sorte que la fonction est appelée en tant que constructeur. Lorsqu'elle est appelée avecnew
, la fonction de ce est configuré pour faire référence à un Objet dont le[[Prototype]]
propriété a la valeur de référence par le constructeur public prototype. Ainsi, dans l'instruction d'affectation, lex
propriété sera créé sur ce nouvel objet. Lorsqu'il est appelé en tant que constructeur, une fonction retourne sa ce objet par défaut, donc il n'est pas nécessaire de séparer lesreturn this;
déclaration.Pour vérifier que Un a un x propriété:
Cela est assez rare d'utiliser des nouveau depuis le seul moyen de référence est le constructeur via A. constructeur. Il serait beaucoup plus fréquent de faire:
Une autre façon de parvenir à un résultat similaire est d'utiliser un immédiatement appelé la fonction de l'expression:
Dans ce cas,
A
affecté la valeur de retour de l'appel de fonction sur le côté droit. Ici encore, depuis ce n'est pas définie dans l'appel, il fait référence à l'objet global etthis.x
est efficacewindow.x
. Puisque la fonction ne retourne rien,A
aura une valeur deundefined
.Ces différences entre les deux approches se manifeste aussi, si vous êtes à la sérialisation et de la sérialisation de vos objets Javascript/à partir de JSON. Les méthodes définies sur un prototype de l'objet ne sont pas numérotés lors de la sérialisation de l'objet, ce qui peut être pratique lorsque, par exemple, vous souhaitez sérialiser les données à des parties d'un objet, mais pas de méthodes:
Questions liées:
Note: Il ne peut pas y avoir d'importantes économies de mémoire entre les deux approches, cependant en utilisant le prototype de partager des méthodes et des propriétés susceptibles d'utiliser moins de mémoire que chaque instance d'avoir sa propre copie.
JavaScript n'est pas un langage de bas niveau. Il peut ne pas être très précieux pour penser le prototypage ou d'autres modes de transmission comme un moyen de modifier explicitement la façon dont la mémoire est allouée.
null
), mais c'est très différent de laprototype
de la propriété qui est sur les fonctions et à qui le prototype de toutes les instances est ensemble quand ils sont construits avecnew
. Ne crois pas que ce vraiment eu 87 upvotes 🙁"The language is functional"
êtes-vous sûr que c'est ce fonctionnel?Je seconde ce que @Bergi dit à propos de prototypes. Les fonctions ont une propriété prototype. Tous les objets, y compris les fonctions, ont une autre propriété interne, qui peut être consulté à l'Objet.getPrototypeOf(monobjet) ou avec myObject.__proto__ dans certains navigateurs. Le proto propriété indique le parent de l'objet dans la chaîne de prototype (ou de l'objet à partir duquel cet objet hérite). Le prototype de la propriété (qui est seulement sur les fonctions), a indiqué l'objet qui deviendra la mère de tous les objets qui utilisent la fonction pour créer de nouveaux objets à l'aide du mot clé new.
Cet article est tout à fait erronée et confond comment ce est réglé. Travail sur une ré–écrire.
Cette réponse est assez bizarre et semble entièrement manquer le point de la question. La question semble être un très commun sur la définition des propriétés de type dans le constructeur contre le protoype, mais la moitié de la réponse est sur ce qui se passerait si vous avez utilisé
A
comme une fonction, et l'autre moitié est d'environ obscur et peu orthodoxe des moyens de faire quelque chose de simple.OriginalL'auteur
Comme d'autres l'ont dit la première version, l'utilisation de "ce" des résultats à chaque instance de la classe A, de son propre copie indépendante de la méthode de la fonction "x". Tandis que l'utilisation de "prototype" signifie que chaque instance de la classe A pour utiliser la même copie de la méthode "x".
Voici un peu de code pour montrer cette différence subtile:
Comme d'autres l'ont mentionné, il y a plusieurs raisons pour choisir une méthode ou l'autre. Mon échantillon est juste pour démontrer clairement la différence.
C'est parce que mon exemple n'était pas bon. Cela ne fait de mal pour les deux années. Soupir. Mais le point est toujours valide. J'ai mis à jour l'exemple avec l'un qui fonctionne réellement. Merci pour le tuyau.
C'est une méthode statique! 😀
oui ... "prototype" signifie statique ou le niveau de la classe .. qui sera partagée par toutes les instances créées ... alors que " il " est une méthode d'instance qui, chaque cas doit avoir sa propre copie
Il n'est pas statique. Statique, tel qu'utilisé dans la plupart des langages à objets, implique qu'il n'y a pas de dépendance à la
this
objet, qui est le propriétaire de la méthode. la méthode n'a pas d'objet qui en est le propriétaire. Dans ce cas, il y a unthis
objet, comme indiqué dans la classe A dans l'exemple.OriginalL'auteur Benry
Prendre que ces 2 exemples:
vs
La plupart des gens ici (surtout les meilleurs réponses) a tenté d'expliquer comment ils sont différents, sans expliquer POURQUOI. Je pense que c'est faux et si vous comprenez les fondements d'abord, la différence devient évidente. Nous allons essayer d'expliquer les principes fondamentaux de la première...
a) Une fonction est un objet en JavaScript. CHAQUE objet en JavaScript obtient une propriété interne (ce qui signifie que vous ne pouvez pas y accéder comme les autres propriétés, sauf peut-être dans les navigateurs comme google Chrome), souvent désigné comme
__proto__
(vous pouvez en fait le type deanyObject.__proto__
dans google Chrome pour voir ce qu'il référence. C'est juste que, une propriété, rien de plus. Une propriété en JavaScript = une variable à l'intérieur d'un objet, rien de plus. Ce n'variables? Ils désignent des choses.Alors qu'est-ce
__proto__
bien des points? Eh bien, en général un autre objet (nous expliquerons plus loin pourquoi). Le seul moyen de forcer le JavaScript pour le__proto__
propriété NON point à un autre objet à l'aide devar newObj = Object.create(null)
. Même si vous faites cela, l'__proto__
propriété existe TOUJOURS en tant que propriété de l'objet, il n'a pas de point à un autre objet, il soulignenull
.C'est ici que la plupart des gens se confondre:
Lorsque vous créez une nouvelle fonction en JavaScript (qui est un objet, vous vous souvenez?), le moment où elle est définie, JavaScript crée automatiquement une nouvelle propriété sur cette fonction appelée
prototype
. Essayez-le:A.prototype
est TOTALEMENT DIFFÉRENTE de la__proto__
de la propriété. Dans notre exemple, " A "a maintenant DEUX propriétés appelé "prototype" et__proto__
. C'est une grande confusion pour les gens.prototype
et__proto__
propriétés sont en aucune façon liés, ils sont des choses distinctes de pointage pour séparer les valeurs.Vous pouvez vous demander: Pourquoi est-ce que JavaScript a
__proto__
biens créés sur chaque objet unique? Eh bien, un seul mot: délégation. Lorsque vous appelez une propriété sur un objet et que l'objet ne l'a pas, alors le JavaScript semble pour l'objet référencé par__proto__
pour voir si il a peut-être. Si elle ne l'a pas, alors il regarde l'objet__proto__
de la propriété et ainsi de suite...jusqu'à ce que les extrémités de la chaîne. Ainsi, le nom prototype de la chaîne d'. Bien sûr, si__proto__
ne pointe pas vers un objet et à la place des points denull
, eh bien pas de chance, JavaScript se rend compte que et sera de retour que vousundefined
de la propriété.Vous pouvez aussi vous demander, pourquoi ne JavaScript crée une propriété appelée
prototype
pour une fonction lorsque vous définissez la fonction? Parce qu'il essaie de vous tromper, oui vous tromper qu'il fonctionne comme la classe de base des langues.Continuons avec notre exemple et créer un "objet" de
A
:Il y a quelque chose qui se passe en arrière-plan lorsque cette chose qui s'est passé.
a1
est une variable qui a été attribué un nouvel objet vide.Le fait que vous avez utilisé l'opérateur
new
avant l'invocation de la fonctionA()
fait quelque chose de SUPPLÉMENTAIRE à l'arrière-plan. Lenew
mot-clé créé un nouvel objet qui fait maintenant référence à laa1
et que l'objet est vide. Voici ce qui se produit en outre:Nous a dit qu'à chaque définition de fonction il y a une nouvelle propriété créée appelé
prototype
(à laquelle vous pouvez accéder, à la différence de la__proto__
propriété) créé? Eh bien, que le bien est utilisé maintenant.Donc nous sommes maintenant au point où nous sommes fraîchement cuits au four à vide
a1
objet. Nous avons dit que tous les objets en JavaScript interne__proto__
propriété qui pointe vers quelque chose (a1
l'a aussi), si elle est null ou un autre objet. Ce que lenew
opérateur n'est qu'il jeux de__proto__
bien à point pour la fonctionprototype
de la propriété. Lire encore une fois. C'est essentiellement ceci:Nous dit que
A.prototype
est rien de plus qu'un objet vide (à moins de le changer pour quelque chose d'autre avant de définira1
). Alors maintenant, fondamentalementa1.__proto__
points à la même choseA.prototype
points, ce qui n'est que vide de l'objet. Ils pointent vers le même objet qui a été créé lors de cette ligne qui s'est passé:Maintenant, il y a une autre chose qui se passe quand
var a1 = new A()
instruction est traitée. FondamentalementA()
est exécutée et si A est à quelque chose comme ceci:Ce genre de choses à l'intérieur de
function() { }
s'apprête à exécuter. Lorsque vous atteignez lethis.hey..
ligne,this
est changé àa1
et vous obtenez ceci:Je n'aborde pas pourquoi
this
changements àa1
mais c'est une excellente réponse pour en savoir plus.Donc, pour résumer, lorsque vous ne
var a1 = new A()
il y a 3 choses qui se passe en arrière-plan:a1
.a1 = {}
a1.__proto__
propriété est attribuée à point à la même chose queA.prototype
points (un autre objet vide {} )La fonction
A()
est en cours d'exécution avecthis
de la nouvelle, objet vide créé à l'étape 1 (lire la réponse que j'ai référencé ci-dessus pourquoithis
changements àa1
)Maintenant, nous allons essayer de créer un autre objet:
Étapes 1,2,3 vais le répéter. Avez-vous remarqué quelque chose? Le mot-clé est répéter. Étape 1:
a2
sera un nouvel objet vide, étape 2: son__proto__
propriété de point à la même choseA.prototype
points et plus important encore, l'étape 3: la fonctionA()
est de NOUVEAU exécutée, ce qui signifie quea2
obtiendrezhey
propriété contenant une fonction.a1
eta2
ont deux propriétés nomméhey
qui point pour SÉPARER les 2 fonctions! Nous avons maintenant dupliquer les fonctions dans les mêmes deux objets différents qui font la même chose, oups...Vous pouvez imaginer la mémoire des implications de ce si nous avons 1000 objets créés avecnew A
, après toutes les fonctions déclarations de prendre plus de mémoire que quelque chose comme le numéro 2. Alors, comment éviter cela?Rappeler les raisons de la
__proto__
propriété existe sur chaque objet? De sorte que si vous récupérez lesyoMan
bien sura1
(qui n'existe pas), son__proto__
propriété seront consultés, si c'est un objet (et dans la plupart des cas, il est), il va vérifier s'il contient desyoMan
, et si elle ne le fait pas, il devra le consulter cet objet__proto__
etc. Si c'est le cas, il faudra que la valeur de la propriété et de l'afficher pour vous.Donc, quelqu'un a décidé d'utiliser ce fait + le fait que lorsque vous créez
a1
, son__proto__
bien des points à la même (vide) objetA.prototype
points et de faire cela:Cool! Maintenant, lorsque vous créez
a1
, il va, encore une fois tous les 3 étapes ci-dessus, et dans l'étape 3, cela ne sert à rien, puisquefunction A()
n'a rien à exécuter. Et si nous le faisons:Il va voir que
a1
ne contient pas dehey
et il va vérifier ses__proto__
propriété de l'objet pour voir si elle l'a, ce qui est le cas.Avec cette approche, nous éliminer de la partie à partir de l'étape 3, où les fonctions sont dupliquées sur chaque nouvelle création de l'objet. Au lieu de
a1
eta2
ayant unhey
propriété, AUCUN d'entre eux n'a une. Ce qui, je suppose, vous avez trouvé vous-même maintenant. C'est la bonne chose...si vous comprenez__proto__
etFunction.prototype
, ces questions seront assez évident.NOTE: Certaines personnes ont tendance à ne pas appeler l'interne de la propriété Prototype comme
__proto__
, j'ai utilisé ce nom par l'intermédiaire de la poste afin de la distinguer clairement de laFunctional.prototype
bien comme deux choses différentes.Très complète et instructive réponse. J'ai fait quelques tests de mémoire à l'aide de l'objet structures ci-dessus (A. prototype.hey vs objet.hey) et créé 1000 instances de chacun. L'empreinte mémoire de l'objet de la propriété approche était d'environ 100ko plus grand par rapport au prototype. J'ai ensuite ajouté une autre fonction ayant le même objet appelé "ridicule" et il a augmenté de manière linéaire à 200kb. Pas significatif, mais pas les arachides.
Ce qui est plus intéressant, c'est que le prototype de la méthode est légèrement plus lente que la propriété de l'objet de la méthode en cours d'exécution localement. Dans l'ensemble, je ne suis pas sûr que le javascript doit être utilisé pour la manipulation de données d'objets de numérotation au-dessus de 10k, donc en niant aucune raison de changer les approches basées sur les potentiels effets de mémoire. À ce stade, les travaux devraient être transférées sur un serveur.
Le point est
__proto__
et.prototype
sont des choses totalement différentes.Je ne me sens pas satisfait à de vous donner un upvote... Bien fait!
OriginalL'auteur daremkd
Dans la plupart des cas, ils sont essentiellement les mêmes, mais la deuxième version permet d'économiser la mémoire, car il n'y a qu'une seule instance de la fonction au lieu d'une fonction distincte pour chaque objet.
Une raison d'utiliser la première forme est celle de l'accès "privé". Par exemple:
En raison de règles de portée de javascript, private_var est disponible pour la fonction qui lui est assignée.x, mais pas à l'extérieur de l'objet.
cette réponse ne pas démontrer - que le prototype méthodes ne peuvent accéder à la "public" propriétés de l'objet donné. Seuls les privilégiés de méthodes (pas sur le prototype) peut accéder aux membres privés.
OriginalL'auteur Matthew Crumley
Le premier exemple des modifications de l'interface pour cet objet. Le deuxième exemple, les changements de l'interface pour tous les objets de cette classe.
x
disponible pour tous les objets dont le prototype est assignée à une nouvelle instance d'Un:function B () {}; B.prototype = new A(); var b = new B(); b.x() // Will call A.x if A is defined by first example;
OriginalL'auteur Glenn
L'ultime problème avec l'aide de
this
au lieu deprototype
est que lors du remplacement d'une méthode, le constructeur de la classe de base va encore se référer à la méthode de remplacement. Considérez ceci:contre:
Si vous pensez que ce n'est pas un problème, cela dépend si vous pouvez vivre sans variables privées, et si vous avez assez d'expérience pour savoir qu'une fuite quand vous voyez un. Aussi, avoir à mettre de la logique constructeur après les définitions de méthode n'est pas pratique.
contre:
OriginalL'auteur tarkabak
Chaque objet est lié à un objet prototype. Lorsque vous essayez d'accéder à une propriété qui n'existe pas, JavaScript, regardez dans le prototype de l'objet l'objet de cette propriété et de la renvoyer si elle existe.
La
prototype
propriété d'une fonction constructeur se réfère à l'objet prototype de toutes les instances créées à cette fonction lors de l'utilisation denew
.Dans votre premier exemple, vous ajoutez une propriété
x
pour chaque instance créée avec leA
fonction.Dans le deuxième exemple, vous ajoutez une propriété de l'objet prototype que toutes les instances créées avec
A
point.En conclusion, dans le premier exemple une copie de la fonction est attribuée à chaque instance. Dans le deuxième exemple une seule copie de la fonction est partagée par toutes les instances.
J'ai bien Aimé votre droite en avant approche!! thumps up!
OriginalL'auteur destoryer
Quelle est la différence? => beaucoup.
Je pense, le
this
version est utilisée pour permettre l'encapsulation, c'est à dire les données de la clandestinité.Il permet de manipuler des variables privées.
Regardons l'exemple suivant:
Maintenant, le
prototype
structure peut être appliqué comme suit:Différents adultes ont des âges différents, mais tous les adultes obtiennent les mêmes droits.
Donc, nous les ajouter à l'aide de prototype, plutôt que cela.
Permet de regarder la mise en œuvre maintenant.
Espère que cette aide.
Je ne suis pas sûr que "cette version est utilisée pour permettre l'encapsulation, c'est à dire les données de la clandestinité". Si une propriété à l'intérieur d'une fonction est définie à l'aide de "ce", comme dans "ce.myProperty=...", une telle propriété n'est pas "privé" et peut être consulté à partir d'objets à l'extérieur de la classe à l'aide de la "nouvelle".
OriginalL'auteur oozzal
Le Prototype est le modèle de la classe, qui s'applique à toutes les instances de celui-ci. Alors que c'est le cas particulier de l'objet.
OriginalL'auteur harropriiz
Permettez-moi de vous donner un service plus complet de la réponse que j'ai appris lors d'un JavaScript cours de formation.
La plupart des réponses mentionné déjà une différence, c'est à dire lorsque le prototype d'une fonction est partagée avec tous les (futurs) des cas. Alors que de déclarer la fonction de la classe va créer une copie pour chaque instance.
En général il n'y a pas de bon ou de mauvais, c'est plus une question de goût ou d'une décision de conception en fonction de vos besoins. Le prototype cependant, c'est la technique qui est utilisée pour développer dans un objet, comme j'espère que vous verrez à la fin de cette réponse.
Vous a montré deux modèles dans votre question. Je vais essayer d'expliquer deux de plus et essayer d'expliquer les différences, le cas échéant. N'hésitez pas à modifier/prolonger.
Dans tous les exemples, c'est à propos d'un objet voiture qui a un emplacement et peuvent se déplacer.
Objet Décorateur modèle
Ne sais pas si ce modèle est toujours d'actualité de nos jours, mais il existe. Et il est bon de savoir à ce sujet.
Il vous suffit de passer un objet ou une propriété à la fonction décorateur. Le décorateur renvoie l'objet avec des propriétés et des méthodes.
Classes Fonctionnelles
Une fonction en JavaScript est un spécialiste de l'objet. En plus d'être invoquée, une fonction peut stocker des propriétés comme tout autre objet.
Dans ce cas
Car
est un fonction (aussi pense objet) qui peut être appelée comme vous avez l'habitude de le faire. Il a une propriétémethods
(qui est un objet avec unemove
fonction). LorsqueCar
est appelé leextend
fonction est appelée, ce qui fait de la magie, et s'étend leCar
fonction (pensez à un objet) avec les méthodes définies dansmethods
.Cet exemple, bien que différente, la plus proche de le premier exemple dans la question.
Prototypes Des Classes
Les deux premiers motifs de permettre une analyse de l'utilisation des techniques pour définir des méthodes communes ou à l'aide de méthodes qui sont définies en ligne dans le corps du constructeur. Dans les deux cas, chaque instance possède son propre
move
fonction.Les prototypes modèle ne se prête pas bien à la même examen, parce que la fonction de partage par l'intermédiaire d'un prototype de délégation est le but même pour les prototypes modèle. Comme d'autres l'ont souligné, il est prévu d'avoir une meilleure mémoire.
Néanmoins, il est un point intéressant, à savoir:
Chaque
prototype
objet a de a un la commodité de la propriétéconstructor
, qui renvoie à la fonction (pensez à un objet), il est venu attaché.Concernant les trois dernières lignes:
Dans cet exemple
Car
des liens vers lesprototype
objet, qui relie viaconstructor
àCar
lui-même, c'est à direCar.prototype.constructor
estCar
lui-même. Cela vous permet de comprendre à quel constructeur fonction d'un certain objet.amy.constructor
'recherche échoue et est donc déléguée àCar.prototype
, qui n'ont le constructeur de propriété. Et doncamy.constructor
estCar
.En outre,
amy
est uninstanceof
Car
. Leinstanceof
opérateur travaille en voyant si l'opérande de droite prototype d'un objet (Car
) peut être trouvé n'importe où dans l'opérande de gauche du prototype (amy
) de la chaîne.Certains développeurs peuvent se confondre dans le début. Voir exemple ci-dessous:
La
instanceof
opérateur retournefalse
, parce queDog
'prototype ne peut pas être trouvé n'importe où dansfido
'prototype de la chaîne.fido
est un simple objet qui est créé avec un objet littéral, c'est à dire juste les délégués àObject.prototype
.Pseudoclassical modèles
C'est vraiment juste une autre forme de prototypes motif en forme simplifiée et plus familier à ceux qui se programme en Java par exemple, car il utilise le
new
constructeur.Il fait la même chose que dans les prototypes modèle vraiment, c'est juste du sucre syntaxique, doit surmonter des prototypes modèle.
Cependant, la principale différence est qu'il y a des optimisations mises en œuvre dans les moteurs JavaScript qui ne s'appliquent lors de l'utilisation de la pseudoclassical modèle. Pensez à la pseudoclassical modèle probablement en version plus rapide de prototypes; la relation d'objet dans les deux exemples sont les mêmes.
Enfin, il ne devrait pas être trop difficile de comprendre comment faire de la programmation orientée objet qui peut être fait. Il y a deux sections.
Une section qui définit les propriétés communes/les méthodes du prototype (de la chaîne).
Et une section où vous mettez les définitions qui permettent de distinguer les objets les uns des autres (
loc
variable dans les exemples).C'est ce qui nous permet d'appliquer des concepts comme la super-classe ou sous-classe en JavaScript.
N'hésitez pas à ajouter ou modifier. Une fois de plus complet, je pourrait en faire un wiki de la communauté, peut-être.
Ils le sont, mais on peut "faire OO" avec différentes techniques et les idées, n'est-ce pas?
Pas sûr de vraiment. Beaucoup disent que le prototype de la philosophie est juste différent et beaucoup d'essayer de le comparer à OO parce que l'école de pensée que beaucoup de sont utilisation.
Je veux dire, si vous voulez la pratique OO style et la langue offre un ensemble de techniques qui permettent de le faire, il n'est pas nécessairement mauvais.
OriginalL'auteur Ely
Je sais que cela a été répondu à la mort, mais j'aimerais vous montrer un exemple de différences de vitesse.
Ici, nous sommes la création de 2 000 000 de nouveaux objets avec un
print
méthode dans google Chrome. Nous sommes de stockage de chaque objet dans un tableau. Mettreprint
sur le prototype prend environ 1/2 long.OriginalL'auteur Arnav Aggarwal
Je crois que @Matthieu Crumley est droit. Ils sont fonctionnellement, si ce n'est structurellement équivalent. Si vous utilisez Firebug pour regarder les objets qui sont créés à l'aide de
new
, vous pouvez voir qu'elles sont les mêmes. Cependant, ma préférence serait le suivant. Je suppose qu'il me semble plus comme ce que je suis habitué à en C#/Java. C'est, définir la classe, de définir les champs, constructeur, et des méthodes.MODIFIER Ne veux pas laisser entendre que la portée de la variable a été privé, j'essayais juste pour illustrer la façon dont je définis mes classes en javascript. Nom de la Variable a été modifiée pour refléter cela.
initialize
etx methods do not refer to the
_instance_var` de la propriété sur uneA
exemple, mais à une échelle mondiale. Utilisationthis._instance_var
si vous utilisez le_instance_var
propriété d'unA
instance.oups. fixe.
La chose drôle est, Benry fait une telle erreur, qui a été découvert après deux années aussi bien :p
pas de tests unitaires sur. 🙁
OriginalL'auteur tvanfosson
Tel que discuté dans d'autres réponses, c'est vraiment un facteur de performance, car la fonction dans le prototype est partagé avec toutes les instanciations - plutôt que la fonction crée pour chaque instanciation.
J'ai mis en place un jsperf de le montrer. Il y a une énorme différence dans le temps qu'il faut pour instancier la classe, même si elle est réellement pertinente que si vous effectuez un grand nombre de cas.
http://jsperf.com/functions-in-constructor-vs-prototype
OriginalL'auteur Devgr
Penser à typage statique de la langue, des choses sur
prototype
sont statiques et les choses surthis
sont exemple.OriginalL'auteur Wayou