Cette figure montre à nouveau que chaque objet a un prototype. La fonction constructeur Foo a également la sienne
__proto__
qui est Function.prototype, et qui à son tour fait également référence via sa__proto__
propriété au Object.prototype. Ainsi, répétez, Foo.prototype n'est qu'une propriété explicite de Foo qui se réfère au prototype des objets b et c.
var b = new Foo(20);
var c = new Foo(30);
Quelles sont les différences entre __proto__
et prototype
?
Le chiffre a été tiré de dmitrysoshnikov.com .
__proto__
diffère-constructor.prototype
t-il?Réponses:
__proto__
est l'objet réel utilisé dans la chaîne de recherche pour résoudre les méthodes, etc.prototype
est l'objet utilisé pour créer__proto__
lorsque vous créez un objet avecnew
:la source
prototype
pas disponible sur les instances elles-mêmes (ou sur d'autres objets), mais uniquement sur les fonctions constructeur.prototype
est disponible uniquement sur les fonctions puisqu'elles sont dérivées deFunction
,Function
et ,Object
mais dans tout ce que ce n'est pas. Cependant,__proto__
est disponible partout.__proto__
est de même de l'objet réel qui est enregistré et utilisé comme prototype alors que ceMyconstructure.prototype
n'est qu'un plan pour__proto__
lequel, en fait, l'objet réel est enregistré et utilisé comme protoype. Par conséquent, cemyobject.prototype
ne serait pas une propriété de l'objet réel parce que c'est juste une chose temporaire utilisée par la fonction constructeur pour décrire à quoimyobject.__proto__
devrait ressembler.__proto__
propriété d'un objet est un pointeur sur laprototype
propriété de la fonction constructeur de l' objet? ie foo .__ proto__ === foo.constructor.prototypenewCar.__proto__
ESTCar.prototype
, pas une instance deCar.prototype
. AlorsCar.protoype
qu'EST une instance d'unobject
.Car.prototype
n'est pas quelque chose qui donnenewCar
des propriétés ou de la structure, simplement IS suivantobject
dansnewCar
« la chaîne de prototype.Car.prototype
n'est pas temporaireobject
. C'est leobject
qui est défini comme la valeur de la__proto__
propriété de tout nouveauobject
s fait en utilisantCar
comme aconstructor
. Si vous voulez penser à quoi que ce soit comme un planobject
, pensezCar
à un plan pour les voitures neuvesobject
.prototype
est une propriété d'un objet Function. C'est le prototype des objets construits par cette fonction.__proto__
est la propriété interne d'un objet, pointant vers son prototype. Les normes actuelles fournissent uneObject.getPrototypeOf(O)
méthode équivalente , bien que la norme de facto__proto__
soit plus rapide.Vous pouvez trouver des
instanceof
relations en comparant une fonctionprototype
à la__proto__
chaîne d' un objet , et vous pouvez rompre ces relations en changeantprototype
.Voici
Point
une fonction constructeur, elle construit un objet (structure de données) de façon procédurale.myPoint
est un objet construit parPoint()
doncPoint.prototype
enregistrémyPoint.__proto__
à ce moment-là.la source
__proto__
propriété d'un objet, cela modifie l'objet sur lequel les recherches de prototype sont effectuées. Par exemple, vous pouvez ajouter un objet de méthodes en tant que fonction__proto__
pour avoir une sorte d'objet d'instance appelable.console.log(obj1.call) // [Function: call]
obj1.call()
// TypeError: obj1.call n'est pas une fonction. Je l'ai faitobj.__proto__ = Function.__proto__
myFn.__proto__ = {foo: 'bar'}
La propriété prototype est créée lorsqu'une fonction est déclarée.
Par exemple:
Person.prototype
la propriété est créée en interne une fois que vous déclarez la fonction ci-dessus. De nombreuses propriétés peuvent être ajoutées au Person.prototype qui sont partagées par les instances Person créées à l'aide de new Person ().Il est intéressant de noter que
Person.prototype
est unObject
littéral par défaut (il peut être modifié selon les besoins).Chaque instance créée à l'aide de
new Person()
possède une__proto__
propriété qui pointe vers lePerson.prototype
. Il s'agit de la chaîne utilisée pour parcourir pour trouver une propriété d'un objet particulier.crée 2 instances de
Person
, ces 2 objets peuvent appeler laage
méthodePerson.prototype
asperson1.age
,person2.age
.Dans l'image ci-dessus de votre question, vous pouvez voir que
Foo
c'est unFunction Object
et donc il a un__proto__
lien vers leFunction.prototype
qui à son tour est une instance deObject
et a un__proto__
lien versObject.prototype
. Le lien proto se termine ici avec__proto__
leObject.prototype
pointage versnull
.Tout objet peut avoir accès à toutes les propriétés de sa chaîne
__proto__
de prototypes liées par , formant ainsi la base de l'héritage prototypique.__proto__
n'est pas un moyen standard d'accéder à la chaîne de prototypes, l'approche standard mais similaire consiste à utiliserObject.getPrototypeOf(obj)
.Code ci-dessous pour
instanceof
opérateur donne une meilleure compréhension:L'
instanceof
opérateur de classe d' objet renvoietrue
lorsqu'un objet est une instance d'une classe, plus précisément s'ilClass.prototype
se trouve dans la chaîne de prototypes de cet objet, alors l'objet est une instance de cette classe.La méthode ci-dessus peut être appelée comme:
instanceOf.call(object, Class)
qui renvoie true si l'objet est une instance de Class.la source
prototype
objet a été créé en interne en premier lieu? Pourrait-on simplement attribuer des méthodes statiques à l'objet fonction lui-même. par exemplefunction f(a){this.a = a}; f.increment = function(){return ++this.a}
? Pourquoi n'a-t-on pas choisi cette méthode plutôt que d'ajouter les méthodes à l'prototype
objet? Cela fonctionnera sif.__proto__ = g
où g est la classe de base.prototype
objet a été choisi pour le partage car seules les propriétés exclusives du constructeur de fonction peuvent être stockées dans l'objet constructeur de fonction.instanceof
il en résulterait({}) instanceof Function === true
qu'il n'y aurait aucun moyen de différencier les prototypes si laprototype
propriété était supprimée.new
mot - clé pour créer une instance, les propriétés et les méthodes ne seraient pas copiées plus de.Une belle façon d'y penser est ...
prototype
est utilisé par lesconstructor()
fonctions. Cela aurait vraiment dû être appelé quelque chose comme,"prototypeToInstall"
, puisque c'est ce que c'est.et
__proto__
est ce "prototype installé" sur un objet (qui a été créé / installé sur l'objet à partir de laditeconstructor()
fonction)la source
constructor()
fonctions" en "fonctions constructeur", car il pourrait y avoir confusion avec "__proto__.constructor()
fonctions". Je considère cela important, car le constructeur __proto __. N'est pas réellement invoqué lorsqu'unnew
mot clé est utilisé.Pour expliquer, créons une fonction
Lorsque JavaScript exécute ce code, il ajoute une
prototype
propriété àa
, laprototype
propriété est un objet avec deux propriétés:constructor
__proto__
Alors quand on fait
a.prototype
il revientMaintenant, comme vous pouvez le voir,
constructor
rien que la fonctiona
elle-même et__proto__
pointe vers le niveau racineObject
de JavaScript.Voyons ce qui se passe lorsque nous utilisons une
a
fonction avecnew
un mot clé.Lorsque JavaScript exécute ce code, il fait 4 choses:
__proto__
surb
et fait pointera.prototype
doncb.__proto__ === a.prototype
a.prototype.constructor
(qui est la définition de la fonctiona
) avec le nouvel objet créé (créé à l'étape # 1) comme contexte (ceci), d'où laname
propriété passée en tant que 'JavaScript' (qui est ajoutée àthis
) est ajoutée à l'objet nouvellement créé.b
soit assigné à l'objet nouvellement créé.Maintenant, si nous ajoutons
a.prototype.car = "BMW"
et faisonsb.car
, la sortie "BMW" apparaît.cela est dû au fait que lorsque JavaScript a exécuté ce code, il a recherché une
car
propriétéb
, il n'a pas trouvé JavaScript utiliséb.__proto__
(qui a été fait pour pointer vers 'a.prototype' à l'étape # 2) et trouve unecar
propriété, donc retournez "BMW".la source
constructor
ne revient pasa()
! Il revienta
. 2.__proto__
renvoieObject.prototype
, pas l'objet racine en Javascript.Prototype VS. __proto__ VS. [[Prototype]]
Lors de la création d'une fonction, un objet de propriété appelé prototype est créé automatiquement (vous ne l'avez pas créé vous-même) et est attaché à l'objet fonction (le
constructor
).Remarque : Ce nouvel objet prototype pointe également vers, ou a un lien interne-privé vers, l'objet JavaScript natif.
Exemple:
Si vous créez un nouvel objet en
Foo
utilisant lenew
mot - clé, vous créez essentiellement (entre autres choses) un nouvel objet qui a un lien interne ou privé vers leFoo
prototype de la fonction dont nous avons discuté précédemment:Le lien privé vers l'objet de cette fonction appelé prototype à double crochets ou simplement
[[Prototype]]
. De nombreux navigateurs nous fournissent un lien public vers celui-ci qui s'appelle__proto__
!Pour être plus précis, il
__proto__
s'agit en fait d'une fonction getter qui appartient à l'objet JavaScript natif. Il renvoie le lien prototype interne-privé de lathis
liaison (retourne le[[Prototype]]
deb
):Il convient de noter qu'à partir de
ECMAScript5
, vous pouvez également utiliser la méthode getPrototypeOf pour obtenir la liaison privée interne:NOTE: cette réponse n'a pas l' intention de couvrir tout le processus de création de nouveaux objets ou de nouveaux constructeurs, mais pour aider à mieux comprendre ce qui est
__proto__
,prototype
et[[Prototype]]
et comment cela fonctionne.la source
Pour être un peu clair en plus des bonnes réponses ci-dessus:
Les instances ont __proto__ , les classes ont un prototype .
la source
En JavaScript, une fonction peut être utilisée comme constructeur. Cela signifie que nous pouvons en créer des objets à l'aide du nouveau mot-clé. Chaque fonction constructeur est livrée avec un objet intégré chaîné avec eux. Cet objet intégré est appelé un prototype.
Instances of a constructor function use __proto__ to access the prototype property of its constructor function.
Tout d' abord nous avons créé un constructeur:
function Foo(){}
. Pour être clair, Foo n'est qu'une autre fonction. Mais nous pouvons en créer un objet avec le nouveau mot-clé. C'est pourquoi nous l'appelons la fonction constructeurChaque fonction a une propriété unique qui est appelée la propriété prototype. Ainsi, la fonction Constructor
Foo
a une propriété prototype qui pointe vers son prototype, qui estFoo.prototype
(voir image).Les fonctions de constructeur sont elles-mêmes une fonction qui est une instance d'un constructeur de système appelé le constructeur [[Function]]. On peut donc dire que
function Foo
c'est construit par un constructeur [[Function]]. Ainsi,__proto__
de notreFoo function
volonté pointera vers le prototype de son constructeur, qui estFunction.prototype
.Function.prototype
est lui-même n'est rien d'autre qu'un objet qui est construit à partir d'un autre constructeur de système appelé[[Object]]
. Donc,[[Object]]
c'est le constructeur deFunction.prototype
. Donc, nous pouvons direFunction.prototype
est une instance de[[Object]]
. Donc__proto__
deFunction.prototype
points àObject.prototype
.Object.prototype
est le dernier homme debout dans la chaîne prototype. Je veux dire qu'il n'a pas été construit. C'est déjà là dans le système. Donc, ses__proto__
pointsnull
.Nous arrivons maintenant à des exemples de
Foo
. Lorsque nous créons une instance à l'aidenew Foo()
, cela crée un nouvel objet qui est une instance deFoo
. Cela signifie queFoo
c'est le constructeur de ces instances. Ici, nous avons créé deux instances (x et y).__proto__
de x et y pointe donc versFoo.prototype
.la source
Sommaire:
La
__proto__
propriété d'un objet est une propriété qui correspond à laprototype
fonction constructeur de l'objet. En d'autres termes:instance.__proto__ === constructor.prototype // true
Ceci est utilisé pour former la
prototype
chaîne d'un objet. Laprototype
chaîne est un mécanisme de recherche de propriétés sur un objet. Si la propriété d'un objet est accessible, JavaScript va d'abord regarder l'objet lui-même. Si la propriété n'y est pas trouvée, elle grimpera jusqu'àprotochain
ce qu'elle soit trouvée (ou non)Exemple:
Notre premier journal se traduit par
true
, car, comme mentionné, la__proto__
propriété de l'instance créée par le constructeur fait référence à la propriétéprototype
propriété du constructeur. N'oubliez pas qu'en JavaScript, les fonctions sont également des objets. Les objets peuvent avoir des propriétés, et une propriété par défaut de n'importe quelle fonction est une propriété nommée prototype.Ensuite, lorsque cette fonction est utilisée comme fonction constructeur, l'objet instancié à partir d'elle recevra une propriété appelée
__proto__
. Et cette__proto__
propriété fait référence à laprototype
propriété de la fonction constructeur (qui, par défaut, chaque fonction a).Pourquoi est-ce utile?
JavaScript possède un mécanisme lors de la recherche de propriétés sur
Objects
lesquelles est appelé «héritage prototypique» , voici ce qu'il fait essentiellement:__proto__
propriété. Là, il vérifie si la propriété est disponible sur l'objet référencé par__proto__
.__proto__
objet, elle grimpera jusqu'à la__proto__
chaîne, jusqu'à l'Object
objet.prototype
chaîne, il reviendraundefined
.Par exemple:
la source
Il se trouve que j'apprends un prototype de You Don't Know JS: this & Object Prototypes , qui est un livre merveilleux pour comprendre la conception en dessous et clarifier tant d'idées fausses (c'est pourquoi j'essaie d'éviter d'utiliser l'héritage et des choses comme
instanceof
).Mais j'ai la même question que les personnes posées ici. Plusieurs réponses sont vraiment utiles et instructives. J'aimerais aussi partager mes compréhensions.
Qu'est-ce qu'un prototype?
Les objets en JavaScript ont une propriété interne, notée dans la spécification comme
[[Prototype]]
, qui est simplement une référence à un autre objet. Presque tous les objets reçoivent une valeur nonnull
valeur pour cette propriété, au moment de leur création.Comment obtenir le prototype d'un objet?
via
__proto__
ouObject.getPrototypeOf
C'est quoi
prototype
?prototype
est un objet créé automatiquement en tant que propriété spéciale d'une fonction , qui est utilisé pour établir la chaîne de délégation (héritage), également appelée chaîne prototype.Lorsque nous créons une fonction
a
, elleprototype
est automatiquement créée en tant que propriété spéciale sura
et enregistre le code de fonction en tant queconstructor
onprototype
.J'adorerais considérer cette propriété comme l'endroit où stocker les propriétés (y compris les méthodes) d'un objet fonction. C'est aussi la raison pour laquelle les fonctions utilitaires dans JS sont définies comme
Array.prototype.forEach()
,Function.prototype.bind()
,Object.prototype.toString().
Pourquoi mettre en valeur la propriété d'une fonction ?
Ainsi,
Arary
,Function
,Object
sont toutes les fonctions. Je dois admettre que cela rafraîchit mon impression sur JS. Je sais que les fonctions sont des citoyens de première classe dans JS, mais il semble qu'il soit construit sur des fonctions.Quelle est la différence entre
__proto__
etprototype
?__proto__
une référence fonctionne sur chaque objet pour faire référence à son[[Prototype]]
propriété.prototype
est un objet créé automatiquement en tant que propriété spéciale d'une fonction , qui est utilisé pour stocker les propriétés (y compris les méthodes) d'un objet fonction.Avec ces deux, nous pourrions cartographier mentalement la chaîne prototype. Comme cette image illustre:
la source
En JavaScript, chaque objet (la fonction est aussi un objet!) A une
__proto__
propriété, la propriété fait référence à son prototype.Lorsque nous utilisons l'
new
opérateur avec un constructeur pour créer un nouvel objet, la__proto__
propriété du nouvel objet sera définie avec laprototype
propriété du constructeur , puis le constructeur sera appelé par le nouvel objet, dans ce processus "ceci" sera une référence au nouvel objet dans la portée du constructeur, retourne finalement le nouvel objet.Le prototype du constructeur est la
__proto__
propriété, laprototype
propriété du constructeur est le travail avec l'new
opérateur.Le constructeur doit être une fonction, mais la fonction n'est pas toujours constructeur même si elle a une
prototype
propriété.La chaîne de prototype est en fait la
__proto__
propriété de l'objet pour référencer son prototype, et la__proto__
propriété du prototype pour référencer le prototype du prototype, et ainsi de suite, jusqu'à référencer la__proto__
propriété du prototype de l' objet qui fait référence à null.Par exemple:
[[Prototype]]
et la__proto__
propriété est en fait la même chose.Nous pouvons utiliser la méthode getPrototypeOf d'Object pour obtenir le prototype de quelque chose.
Toute fonction que nous avons écrite peut être utilisée pour créer un objet avec l'
new
opérateur, donc n'importe laquelle de ces fonctions peut être un constructeur.la source
Une autre bonne façon de le comprendre:
Ce n'est qu'après IE11
__proto__
est pris en charge. Avant cette version, comme IE9, vous pouviez utiliser leconstructor
pour obtenir le__proto__
.la source
prototype
prototype est une propriété d'une fonction. C'est le plan pour créer des objets en utilisant cette fonction (constructeur) avec un nouveau mot-clé.
__proto__
est utilisé dans la chaîne de recherche pour résoudre les méthodes et les propriétés. lorsqu'un objet est créé (en utilisant la fonction constructeur avec un nouveau mot-clé),__proto__
est défini sur (Constructeur) Function.prototypeVoici mon explication (imaginaire) pour effacer la confusion:
Imaginez qu'il existe une classe imaginaire (blueprint / coockie cutter) associée à la fonction. Cette classe imaginaire est utilisée pour instancier des objets.
prototype
est le mécanisme d'extention (méthode d'extention en C # ou Swift Extension) pour ajouter des choses à cette classe imaginaire.Ce qui précède peut être imaginé comme:
Donc,
Ajoutons maintenant une méthode au
prototype
Robot:Ce qui précède peut être imaginé comme une extension de la classe Robot:
Lequel, à son tour,
la source
__proto__
et à des prototypes plus cohérents . peut-être prototype et héritage?prototype
et les__proto__
deux devraient être évités. Nous avons des cours maintenant et j'aime OOP.Pour le dire simplement:
Cela vous permet d'attacher des propriétés à X.prototype APRÈS que les objets de type X aient été instanciés, et ils auront toujours accès à ces nouvelles propriétés via la référence __proto__ que le moteur Javascript utilise pour remonter la chaîne de prototype.
la source
Prototype ou Object.prototype est une propriété d'un objet littéral. Il représente l' objet prototype d'objet que vous pouvez remplacer pour ajouter davantage de propriétés ou de méthodes le long de la chaîne du prototype.
__proto__ est une propriété d'accesseur (fonction get et set) qui expose le prototype interne d'un objet par lequel il est accédé.
Références:
http://www.w3schools.com/js/js_object_prototypes.asp
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto
la source
Object.prototype
n'est pas une propriété d'un objet littéral, essayer d'imprimer des{}.prototype
retours indéfinis; cependant, il est accessible via{}.__proto__
, qui revientObject.prototype
.Je sais, je suis en retard mais permettez-moi d'essayer de le simplifier.
Disons qu'il y a une fonction
La fonction Foo aura un objet prototype lié. Ainsi, chaque fois que nous créons une fonction en JavaScript, elle a toujours un objet prototype qui lui est lié.
Maintenant, allons-y et créons deux objets en utilisant la fonction Foo.
Maintenant, Foo.prototype, a. proto , et b. proto all désigne le même objet.
tout ce qui précède reviendrait vrai.
Comme nous le savons, en JavaScript, les propriétés peuvent être ajoutées dynamiquement. Nous pouvons ajouter une propriété à l'objet
Comme vous le voyez, nous avons ajouté la méthode Greet () dans Foo.prototype mais elle est accessible dans a et b ou tout autre objet construit à l'aide de Foo.
Lors de l'exécution de a.Greet (), JavaScript recherchera d'abord Greet dans l'objet a de la liste des propriétés. En ne trouvant pas, il montera en chaîne proto de a. Depuis un. proto et Foo.prototype est le même objet, JavaScript trouvera la méthode Greet () et l'exécutera.
J'espère que maintenant le prototype et le proto sont un peu simplifiés.
la source
Exemple explicatif:
maintenant, myPupppie a une
__proto__
propriété qui pointe vers Dog.prototype.mais myPuppie n'a PAS de propriété prototype.
Ainsi,
__proto__
de mypuppie est la référence à la propriété .prototype de la fonction constructeur qui a été utilisée pour instancier cet objet (et l'objet myPuppie actuel a une relation "délégués à" à cet__proto__
objet), tandis que la propriété .prototype de myPuppie est simplement absente (puisque nous ne l'avons pas réglé).Bonne explication par MPJ ici: proto vs prototype - Création d'objets en JavaScript
la source
Je me suis fait un petit dessin qui représente l'extrait de code suivant:
J'ai une formation OO classique, il était donc utile de représenter la hiérarchie de cette manière. Pour vous aider à lire ce diagramme, traitez les rectangles de l'image comme des objets JavaScript. Et oui, les fonctions sont aussi des objets. ;)
Les objets en JavaScript ont des propriétés et ne
__proto__
sont que l'un d'entre eux.L'idée derrière cette propriété est de pointer vers l'objet ancêtre dans la hiérarchie (héritage).
L'objet racine en JavaScript est
Object.prototype
et tous les autres objets sont des descendants de celui-ci. La__proto__
propriété de l'objet racine estnull
, qui représente la fin de la chaîne d'héritage.Vous remarquerez que
prototype
c'est une propriété des fonctions.Cat
est une fonction, mais aussiFunction
etObject
sont des fonctions (natives).tom
n'est pas une fonction, il n'a donc pas cette propriété.L'idée derrière cette propriété est de pointer vers un objet qui sera utilisé dans la construction, c'est-à-dire lorsque vous appelez l'
new
opérateur sur cette fonction.En effet, lorsque nous créons l'
tom
objet avecnew Cat()
, l'objet créé aura la__proto__
propriété définie sur l'prototype
objet de la fonction constructeur.Au final, jouons un peu avec ce schéma. Les affirmations suivantes sont vraies:
tom.__proto__
La propriété pointe vers le même objet queCat.prototype
.Cat.__proto__
pointe vers l'Function.prototype
objet, tout commeFunction.__proto__
etObject.__proto__
faire.Cat.prototype.__proto__
ettom.__proto__.__proto__
pointez sur le même objet et qui estObject.prototype
.À votre santé!
la source
tom.__proto__
etCat.prototype
sont strictement égaux, donc,tom.__proto__ === Cat.prototype
etCat.prototype === tom.__proto__
sont vrais. Alors, qu'entendez-vous par la flèche sur l'image ??prototype
est de même de la propriété de l'Cat
objet (d'après votre question).DÉFINITIONS
(le numéro entre parenthèses () est un «lien» vers le code écrit ci-dessous)
prototype
- un objet qui se compose de:=> fonctions (3) de ce particulier
ConstructorFunction.prototype
(5) qui sont accessibles par chaque objet (4) créé ou à créer via cette fonction constructeur (1)=> la fonction constructeur elle-même (1 )
=>
__proto__
de cet objet particulier (objet prototype)__proto__
(dandor proto?) - un lien ENTRE tout objet (2) créé par une fonction constructeur particulière (1) ET les propriétés de l'objet prototype (5) de ce constructeur QUI permet à chaque objet créé (2) d'avoir accès aux fonctions du prototype et méthodes (4) (__proto__
est par défaut inclus dans chaque objet unique dans JS)CLARIFICATION DU CODE
1.
2.
3.
4.
5.
la source
Je vais essayer une explication de 4e année:
Les choses sont très simples. A
prototype
est un exemple de la façon dont quelque chose doit être construit. Donc:Je suis un
function
et je construis de nouveaux objets similaires à monprototype
Je suis un
object
et j'ai été construit en utilisant mon__proto__
comme exemplepreuve :
la source
prototype
ni ni ne__proto__
sont utilisés à tout moment comme modèle ou ainsi pour créer un objet. C'est un mythe introduit par laclass
syntaxe floue et ses prédécesseurs. Comme le dit le message de réponse, il est juste utilisé pour la chaîne de recherche et en cas d'prototype
identificationconstructor
utilisé avecnew
(qui fait partie de ce mécanisme prétendant être chic qui déroute de nombreux utilisateurs, dont moi).Chaque fonction que vous créez a une propriété appelée
prototype
, et elle commence sa vie en tant qu'objet vide. Cette propriété n'est d'aucune utilité tant que vous n'utilisez pas cette fonction comme fonction constructeur, c'est-à-dire avec le mot-clé 'new'.Cela est souvent confondu avec la
__proto__
propriété d'un objet. Certains peuvent devenir confus et sauf que laprototype
propriété d'un objet peut leur donner le proto d'un objet. Mais ce n'est pas le cas.prototype
est utilisé pour obtenir__proto__
un objet créé à partir d'un constructeur de fonction.Dans l'exemple ci-dessus:
J'espère que ça a du sens.
la source
prototype
n'est pas utilisé pour créer l'__proto__
objet d'un.__proto__
, lorsqu'il est accédé, fournit simplement une référence à l'prototype
objet.Qu'en est-il de l'utilisation
__proto__
pour les méthodes statiques?la source
__proto__
VS.prototype
en JavaScript" ?Essayez ce code pour comprendre
la source
Un seul objet est utilisé pour le chaînage protypal. Cet objet a évidemment un nom et une valeur:
__proto__
c'est son nom, etprototype
c'est sa valeur. C'est tout.pour le rendre encore plus facile à saisir, regardez le diagramme en haut de ce post (Diagramme de dmitry soshnikov), vous ne trouverez jamais de
__proto__
points vers autre choseprototype
que sa valeur.L'essentiel est le suivant:
__proto__
c'est le nom qui fait référence à l'objet prototypique, etprototype
c'est l'objet prototypique réel.C'est comme dire:
x
est le nom de l'objet (pointeur) et{name: 'john'}
l'objet réel (valeur de données).REMARQUE: ceci est juste un indice massivement simplifié sur la façon dont ils sont liés à un niveau élevé.
Mise à jour: Voici un exemple javascript concret simple pour une meilleure illustration:
Cela signifie que lorsque
Object.getPrototypeOf(x)
nous obtient la valeur réellex
(qui est son prototype), est exactement ce que__proto__
dex
pointe. Par conséquent__proto__
pointe en effet vers le prototype dex
. Ainsi__proto__
référencex
(pointeur dex
), etprototype
est la valeur dex
(son prototype).J'espère que c'est un peu clair maintenant.
la source
Il s'agit d'une question très importante pour tous ceux qui souhaitent comprendre l'héritage prototypique. D'après ce que je comprends, le prototype est attribué par défaut quand un objet est créé avec new à partir d'une fonction car Function a un objet prototype par définition:
Lorsque nous créons un objet ordinaire sans nouveau, c'est-à-dire explicitement à partir d'une fonction, il n'a pas de prototype mais il a un proto vide auquel on peut attribuer un prototype.
Nous pouvons utiliser Object.create pour lier explicitement un objet.
la source
__proto__
est la base à construireprototype
et une fonction constructeur par exemple:function human(){}
hasprototype
qui est partagée via__proto__
dans la nouvelle instance de la fonction constructeur. Une lecture plus détaillée icila source
Comme cela a été dit à juste titre
Nous pouvons en outre noter que la
__proto__
propriété d'un objet créé à l'aide du constructeur de fonction pointe vers l'emplacement de mémoire pointé par la propriété prototype de ce constructeur respectif.Si nous modifions l'emplacement mémoire du prototype de la fonction constructeur, l'
__proto__
objet dérivé continuera de pointer vers l'espace d'adressage d'origine. Par conséquent, pour rendre la propriété commune disponible dans la chaîne d'héritage, ajoutez toujours la propriété au prototype de fonction constructeur , au lieu de la réinitialiser (ce qui changerait son adresse mémoire).Prenons l'exemple suivant:
la source
ma compréhension est: __proto__ et prototype sont tous servis pour la technique de chaîne de prototype. la différence est que les fonctions nommées avec un trait de soulignement (comme __proto__) ne sont pas du tout destinées aux développeurs invoqués explicitement. en d'autres termes, ils ne sont que pour certains mécanismes comme l'héritage, etc. ils sont «back-end». mais les fonctions nommées sans trait de soulignement sont conçues pour être invoquées explicitement, elles sont «frontales».
la source
__proto__
etprototype
seulement la convention de dénomination. Ils peuvent ou non pointer vers le même objet. Voir la réponse @zyklus.!!! C'EST LA MEILLEURE EXPLICATION AU MONDE !!!!!
dans les constructeurs de fonctions, le moteur javascript appelle cela
q.__proto__ = prototype
automatiquement lorsque nous écrivonsnew Class
, et dans l'__proto__
ensemble d'accessoiresClass.prototype
Prendre plaisir %)
la source