Esta figura muestra nuevamente que cada objeto tiene un prototipo. La función de constructor Foo también tiene su propia
__proto__
función, Function.prototype, y que a su vez también hace referencia a través de su__proto__
propiedad al Object.prototype. Por lo tanto, repita, Foo.prototype es solo una propiedad explícita de Foo que se refiere al prototipo de los objetos byc.
var b = new Foo(20);
var c = new Foo(30);
¿Cuáles son las diferencias entre __proto__
y prototype
?
La cifra fue tomada de dmitrysoshnikov.com .
__proto__
difiere deconstructor.prototype
?Respuestas:
__proto__
es el objeto real que se usa en la cadena de búsqueda para resolver métodos, etc.prototype
es el objeto que se usa para construir__proto__
cuando crea un objeto connew
:fuente
prototype
lo tanto, no está disponible en las propias instancias (u otros objetos), sino solo en las funciones de constructor.prototype
sólo está disponible en las funciones ya que se derivan deFunction
,Function
yObject
sino en cualquier otra cosa que no es. Sin embargo,__proto__
está disponible en todas partes.__proto__
es el objeto real que se guarda y se usa como prototipo, mientras queMyconstructure.prototype
es solo un modelo para el__proto__
cual, de hecho, se guarda el objeto real y se usa como el prototipo. Por lo tanto,myobject.prototype
no sería una propiedad del objeto real porque es solo una cosa temporal utilizada por la función de constructor para describir cómomyobject.__proto__
debería ser.__proto__
propiedad de un objeto es un puntero a laprototype
propiedad de la función constructora del objeto ? es decir, foo .__ proto__ === foo.constructor.prototypenewCar.__proto__
ISCar.prototype
, no una instancia deCar.prototype
. MientrasCar.protoype
ES una instancia de unobject
.Car.prototype
no es algo que otorguenewCar
propiedades o estructura, simplemente ES el próximoobject
ennewCar
la cadena de prototipos.Car.prototype
No es temporalobject
. Es elobject
que se establece como el valor de la__proto__
propiedad de cualquier nuevoobject
s hecho usandoCar
comoconstructor
. Si quiere pensar en algo como un planoobject
, pienseCar
en un plano para automóviles nuevosobject
.prototype
es una propiedad de un objeto Function. Es el prototipo de objetos construidos por esa función.__proto__
es propiedad interna de un objeto, apuntando a su prototipo. Los estándares actuales proporcionan unObject.getPrototypeOf(O)
método equivalente , aunque el estándar de facto__proto__
es más rápido.Puede encontrar
instanceof
relaciones comparando una funciónprototype
con la__proto__
cadena de un objeto , y puede romper estas relaciones cambiandoprototype
.Aquí
Point
hay una función constructora, construye un objeto (estructura de datos) procesalmente.myPoint
es un objeto construido porPoint()
lo quePoint.prototype
se guardamyPoint.__proto__
en ese momento.fuente
__proto__
propiedad de un objeto, cambia el objeto en el que se realizan las búsquedas de prototipos. Por ejemplo, puede agregar un objeto de métodos como una función__proto__
para tener una especie de objeto de instancia invocable.console.log(obj1.call) // [Function: call]
obj1.call()
// TypeError: obj1.call no es una función. Lo hiceobj.__proto__ = Function.__proto__
myFn.__proto__ = {foo: 'bar'}
La propiedad prototipo se crea cuando se declara una función.
Por ejemplo:
Person.prototype
La propiedad se crea internamente una vez que declara la función anterior. Se pueden agregar muchas propiedades al Person.prototype que comparten las instancias de Person creadas con la nueva Person ().Vale la pena señalar que
Person.prototype
es unObject
literal por defecto (se puede cambiar según sea necesario).Cada instancia creada usando
new Person()
tiene una__proto__
propiedad que apunta aPerson.prototype
. Esta es la cadena que se usa para atravesar para encontrar una propiedad de un objeto en particular.crea 2 instancias de
Person
, estos 2 objetos pueden llamar alage
método dePerson.prototype
comoperson1.age
,person2.age
.En la imagen de arriba de su pregunta, puede ver que
Foo
es unFunction Object
y, por lo tanto, tiene un__proto__
enlace alFunction.prototype
que a su vez es una instanciaObject
y tiene un__proto__
enlaceObject.prototype
. El enlace de proto termina aquí con__proto__
enObject.prototype
apuntando anull
.Cualquier objeto puede tener acceso a todas las propiedades en su cadena de proto como unidas
__proto__
, formando así la base para la herencia prototípica.__proto__
no es una forma estándar de acceder a la cadena de prototipos, el enfoque estándar pero similar es usarObject.getPrototypeOf(obj)
.El siguiente código para el
instanceof
operador ofrece una mejor comprensión:instanceof
El operador de clase de objeto regresatrue
cuando un objeto es una instancia de una clase, más específicamente siClass.prototype
se encuentra en la cadena de protocolo de ese objeto, entonces el objeto es una instancia de esa clase.El método anterior se puede llamar como:
instanceOf.call(object, Class)
que devuelve verdadero si el objeto es una instancia de Clase.fuente
prototype
objeto fue creado internamente en primer lugar. ¿Podría uno simplemente asignar métodos estáticos al objeto de función en sí? por ejemplofunction f(a){this.a = a}; f.increment = function(){return ++this.a}
? ¿Por qué no se eligió esta forma en lugar de agregar los métodos alprototype
objeto? Esto funcionará sif.__proto__ = g
donde g es la clase base.prototype
objeto se eligió para compartir porque solo las propiedades exclusivas del constructor de funciones se pueden almacenar en el objeto constructor de funciones.instanceof
daría como resultado({}) instanceof Function === true
que no habría forma de diferenciar entre prototipos siprototype
se elimina la propiedad.new
palabra clave para crear una instancia, las propiedades y los métodos no se copiarían terminado.Una buena manera de pensarlo es ...
prototype
Es utilizado por lasconstructor()
funciones. Realmente debería haberse llamado algo así como,"prototypeToInstall"
, ya que eso es lo que es.y
__proto__
es ese "prototipo instalado" en un objeto (que fue creado / instalado sobre el objeto desde dichaconstructor()
función)fuente
constructor()
funciones" a "funciones de constructor", ya que puede haber confusión con "__proto__.constructor()
funciones". Considero esto importante, ya que el constructor __proto __. No se invoca realmente cuandonew
se usa una palabra clave.Para explicar, creemos una función
Cuando JavaScript ejecuta este código, agrega
prototype
propiedad aa
, laprototype
propiedad es un objeto con dos propiedades:constructor
__proto__
Entonces cuando lo hacemos
a.prototype
vuelveAhora, como puede ver,
constructor
no es más que la función ena
sí y__proto__
apunta al nivel raízObject
de JavaScript.Veamos qué sucede cuando usamos la
a
función con lanew
palabra clave.Cuando JavaScript ejecuta este código, hace 4 cosas:
__proto__
enb
y hace que apunte aa.prototype
por lob.__proto__ === a.prototype
a.prototype.constructor
(que es la definición de funcióna
) con el objeto recién creado (creado en el paso 1) como contexto (esto), por lo tanto, laname
propiedad se pasa como 'JavaScript' (que se agrega athis
) se agrega al objeto recién creado.b
se asigne al objeto recién creado.Ahora si agregamos
a.prototype.car = "BMW"
y hacemosb.car
, aparece la salida "BMW".Esto se debe a que cuando JavaScript ejecutó este código en el que buscó la
car
propiedadb
, no encontró el JavaScript utilizadob.__proto__
(que se hizo para apuntar a 'a.prototype' en el paso 2) y encuentra lacar
propiedad, así que devuelve "BMW".fuente
constructor
no vuelvea()
! Vuelvea
. 2.__proto__
devuelveObject.prototype
, no el objeto raíz en Javascript.Prototipo VS. __proto__ VS. [[Prototipo]]
Al crear una función, se crea automáticamente un objeto de propiedad llamado prototipo (no lo creó usted mismo) y se adjunta al objeto de función (el
constructor
).Nota : Este nuevo objeto prototipo también apunta o tiene un enlace privado interno al Objeto JavaScript nativo.
Ejemplo:
Si crea un nuevo objeto al
Foo
usar lanew
palabra clave, básicamente está creando (entre otras cosas) un nuevo objeto que tiene un enlace interno o privado alFoo
prototipo de la función que discutimos anteriormente:El enlace privado al objeto de esa función se llama prototipo de doble paréntesis o simplemente
[[Prototype]]
. Muchos navegadores nos proporcionan un enlace público que llama__proto__
!Para ser más específicos, en
__proto__
realidad es una función getter que pertenece al objeto JavaScript nativo. Devuelve el enlace prototipo interno-privado de lo que sea elthis
enlace (devuelve el[[Prototype]]
deb
):Vale la pena señalar que, al comenzar
ECMAScript5
, también puede usar el método getPrototypeOf para obtener el enlace privado interno:NOTA: esta respuesta no tiene la intención de abarcar todo el proceso de creación de nuevos objetos o nuevos constructores, sino para ayudar a comprender mejor lo que es
__proto__
,prototype
y[[Prototype]]
y cómo funciona.fuente
Para dejarlo un poco claro, además de las excelentes respuestas anteriores:
Las instancias tienen __proto__ , las clases tienen prototipo .
fuente
En JavaScript, una función se puede utilizar como constructor. Eso significa que podemos crear objetos a partir de ellos utilizando la nueva palabra clave. Cada función de constructor viene con un objeto incorporado encadenado con ellos. Este objeto incorporado se llama prototipo.
Instances of a constructor function use __proto__ to access the prototype property of its constructor function.
Primero creamos un constructor:
function Foo(){}
. Para ser claros, Foo es solo otra función. Pero podemos crear un objeto a partir de él con la nueva palabra clave. Por eso lo llamamos la función constructora.Cada función tiene una propiedad única que se llama propiedad prototipo. Entonces, la función Constructor
Foo
tiene una propiedad prototipo que apunta a su prototipo, que esFoo.prototype
(ver imagen).Las funciones de constructor son en sí mismas una función que es una instancia de un constructor de sistema llamado constructor [[Función]]. Entonces podemos decir que
function Foo
está construido por un constructor [[Función]]. Entonces,__proto__
de nuestroFoo function
apuntará al prototipo de su constructor, que esFunction.prototype
.Function.prototype
es en sí mismo nada más que un objeto que se construye a partir de otro constructor de sistema llamado[[Object]]
. Entonces,[[Object]]
es el constructor deFunction.prototype
. Entonces, podemos decir queFunction.prototype
es una instancia de[[Object]]
. Así__proto__
deFunction.prototype
puntos aObject.prototype
.Object.prototype
es el último hombre en la cadena de prototipos. Quiero decir que no ha sido construido. Ya está allí en el sistema. Entonces sus__proto__
puntos anull
.Ahora llegamos a instancias de
Foo
. Cuando creamos una instancia usandonew Foo()
, crea un nuevo objeto que es una instancia deFoo
. Eso significa queFoo
es el constructor de estas instancias. Aquí creamos dos instancias (x e y).__proto__
de x e y por lo tanto apunta aFoo.prototype
.fuente
Resumen:
La
__proto__
propiedad de un objeto es una propiedad que se asigna a laprototype
función constructora del objeto. En otras palabras:instance.__proto__ === constructor.prototype // true
Esto se usa para formar la
prototype
cadena de un objeto. Laprototype
cadena es un mecanismo de búsqueda de propiedades en un objeto. Si se accede a la propiedad de un objeto, JavaScript primero buscará en el objeto mismo. Si la propiedad no se encuentra allí, subirá hastaprotochain
hasta que se encuentre (o no)Ejemplo:
Nuestros primeros resultados de registro
true
son, porque como se mencionó, la__proto__
propiedad de la instancia creada por el constructor se refiere aprototype
propiedad del constructor. Recuerde, en JavaScript, las funciones también son objetos. Los objetos pueden tener propiedades, y una propiedad predeterminada de cualquier función es una propiedad llamada prototipo.Entonces, cuando esta función se utiliza como una función constructora, el objeto instanciado de ella recibirá una propiedad llamada
__proto__
. Y esta__proto__
propiedad se refiere a laprototype
propiedad de la función constructora (que por defecto tiene cada función).¿Por qué es útil esto?
JavaScript tiene un mecanismo al buscar propiedades en el
Objects
que se llama 'herencia prototípica' , esto es lo que básicamente hace:__proto__
propiedad. Allí, comprueba si la propiedad está disponible en el objeto al que hace referencia__proto__
.__proto__
objeto, trepará por la__proto__
cadena hasta elObject
objeto.prototype
cadena, volveráundefined
.Por ejemplo:
fuente
Estoy aprendiendo el prototipo de You Don't Know JS: this & Object Prototypes , que es un libro maravilloso para comprender el diseño debajo y aclarar tantas ideas falsas (es por eso que estoy tratando de evitar el uso de la herencia y cosas por el estilo
instanceof
).Pero tengo la misma pregunta que la gente hizo aquí. Varias respuestas son realmente útiles y esclarecedoras. También me encantaría compartir mis entendimientos.
¿Qué es un prototipo?
Los objetos en JavaScript tienen una propiedad interna, indicada en la especificación como
[[Prototype]]
, que es simplemente una referencia a otro objeto. Casi todos los objetos reciben un nonull
valor para esta propiedad, en el momento de su creación.¿Cómo obtener el prototipo de un objeto?
a través de
__proto__
oObject.getPrototypeOf
¿Cuál es el
prototype
?prototype
es un objeto creado automáticamente como una propiedad especial de una función , que se utiliza para establecer la cadena de delegación (herencia), también conocida como cadena de prototipo.Cuando creamos una función
a
,prototype
se crea automáticamente como una propiedad especial sobrea
y guarda el código de función en la que elconstructor
sobreprototype
.Me encantaría considerar esta propiedad como el lugar para almacenar las propiedades (incluidos los métodos) de un objeto de función. Esa es también la razón por funciones de utilidad en JS se definen como
Array.prototype.forEach()
,Function.prototype.bind()
,Object.prototype.toString().
¿Por qué enfatizar la propiedad de una función ?
Así,
Arary
,Function
,Object
son todas las funciones. Debo admitir que esto refresca mi impresión sobre JS. Sé que las funciones son ciudadanos de primera clase en JS, pero parece que se basa en funciones.¿Cuál es la diferencia entre
__proto__
yprototype
?__proto__
una referencia funciona en cada objeto para referirse a su[[Prototype]]
propiedad.prototype
es un objeto creado automáticamente como una propiedad especial de una función , que se utiliza para almacenar las propiedades (incluidos los métodos) de un objeto de función.Con estos dos, podríamos mapear mentalmente la cadena de prototipos. Como esta imagen ilustra:
fuente
En JavaScript, cada objeto (¡la función también es un objeto!) Tiene una
__proto__
propiedad, la propiedad es referencia a su prototipo.Cuando usamos el
new
operador con un constructor para crear un nuevo objeto, la__proto__
propiedad del nuevo objeto se establecerá con laprototype
propiedad del constructor , luego el constructor será llamado por el nuevo objeto, en ese proceso "esto" será una referencia al nuevo objeto en el ámbito del constructor, finalmente devuelve el nuevo objeto.El prototipo del constructor es
__proto__
propiedad, laprototype
propiedad del constructor es trabajar con elnew
operador.El constructor debe ser una función, pero la función no siempre es un constructor, incluso si tiene una
prototype
propiedad.La cadena de prototipos en realidad es
__proto__
propiedad del objeto para hacer referencia a su prototipo, y la__proto__
propiedad del prototipo para hacer referencia al prototipo del prototipo, y así sucesivamente, hasta hacer referencia a la__proto__
propiedad del prototipo del Objeto que es referencia a nulo.Por ejemplo:
[[Prototype]]
y la__proto__
propiedad en realidad es lo mismo.Podemos usar el método getPrototypeOf de Object para obtener el prototipo de algo.
Cualquier función que escribimos puede usarse para crear un objeto con el
new
operador, por lo que cualquiera de esas funciones puede ser un constructor.fuente
Otra buena forma de entenderlo:
Solo después de que IE11
__proto__
sea compatible. Antes de esa versión, como IE9, puede usar elconstructor
para obtener el__proto__
.fuente
prototipo
El prototipo es una propiedad de una función. Es el modelo para crear objetos usando esa función (constructor) con una nueva palabra clave.
__proto__
se usa en la cadena de búsqueda para resolver métodos, propiedades. cuando se crea un objeto (usando la función de constructor con una nueva palabra clave),__proto__
se establece en (Constructor) Function.prototypeAquí está mi explicación (imaginaria) para aclarar la confusión:
Imagine que hay una clase imaginaria (blueprint / coockie cutter) asociada con la función. Esa clase imaginaria se usa para instanciar objetos.
prototype
es el mecanismo de extensión (método de extensión en C #, o Swift Extension) para agregar cosas a esa clase imaginaria.Lo anterior se puede imaginar como:
Entonces,
Ahora agregando método al
prototype
robot:Lo anterior se puede imaginar como una extensión de la clase Robot:
Que a su vez,
fuente
__proto__
y prototipo. tal vez prototipo y herencia?prototype
y__proto__
ambos deben ser evitados. Tenemos clase ahora y me gusta OOP.Para hacerlo mas simple:
Esto le permite adjuntar propiedades a X.prototype DESPUÉS de que se hayan instanciado objetos de tipo X, y aún así tendrán acceso a esas nuevas propiedades a través de la referencia __proto__ que el motor Javascript usa para subir por la cadena de prototipos.
fuente
Prototype u Object.prototype es una propiedad de un objeto literal. Representa el objeto prototipo del Objeto que puede anular para agregar más propiedades o métodos a lo largo de la cadena del prototipo.
__proto__ es una propiedad de acceso (función get y set) que expone el prototipo interno de un objeto a través del cual se accede.
Referencias
http://www.w3schools.com/js/js_object_prototypes.asp
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto
fuente
Object.prototype
no es una propiedad de un objeto literal, intentar imprimir{}.prototype
retornos indefinidos; sin embargo, se puede acceder a través de{}.__proto__
, que regresaObject.prototype
.Lo sé, llego tarde pero déjame intentar simplificarlo.
Digamos que hay una función
La función Foo tendrá un objeto prototipo vinculado. Entonces, cada vez que creamos una función en JavaScript, siempre tiene un objeto prototipo vinculado.
Ahora sigamos adelante y creemos dos objetos usando la función Foo.
Ahora, Foo.prototype, a. proto , y b. proto all denota el mismo objeto.
todo lo anterior volvería verdadero.
Como sabemos, en JavaScript las propiedades se pueden agregar dinámicamente. Podemos agregar propiedad al objeto
Como puede ver, agregamos el método Greet () en Foo.prototype pero es accesible en ayb o en cualquier otro objeto que se construya usando Foo.
Al ejecutar a.Greet (), JavaScript primero buscará Greet en el objeto a en la lista de propiedades. Al no encontrarlo, subirá en la cadena de proto de a. Desde un. proto y Foo.prototype es el mismo objeto, JavaScript encontrará el método Greet () y lo ejecutará.
Espero, ahora prototipo y proto se simplifica un poco.
fuente
Ejemplo explicativo:
ahora, myPupppie tiene una
__proto__
propiedad que apunta a Dog.prototype.pero myPuppie NO tiene una propiedad prototipo.
Entonces,
__proto__
de mypuppie es la referencia a la propiedad .prototype de la función constructora que se usó para instanciar este objeto (y el objeto myPuppie actual tiene una relación de "delegados a" con este__proto__
objeto), mientras que la propiedad .prototype de myPuppie simplemente está ausente (ya que no lo configuramos).Buena explicación por MPJ aquí: proto vs prototipo - Creación de objetos en JavaScript
fuente
Me hice un pequeño dibujo que representa el siguiente fragmento de código:
Tengo un fondo clásico de OO, por lo que fue útil representar la jerarquía de esta manera. Para ayudarlo a leer este diagrama, trate los rectángulos de la imagen como objetos JavaScript. Y sí, las funciones también son objetos. ;)
Los objetos en JavaScript tienen propiedades y
__proto__
es solo uno de ellos.La idea detrás de esta propiedad es apuntar al objeto ancestro en la jerarquía (herencia).
El objeto raíz en JavaScript es
Object.prototype
y todos los demás objetos son descendientes de este. La__proto__
propiedad del objeto raíz esnull
, que representa el final de la cadena de herencia.Notarás que
prototype
es una propiedad de las funciones.Cat
es una función, pero tambiénFunction
yObject
son funciones (nativas).tom
no es una función, por lo tanto no tiene esta propiedad.La idea detrás de esta propiedad es apuntar a un objeto que se utilizará en la construcción, es decir, cuando llame al
new
operador en esa función.De hecho, cuando creamos el
tom
objeto connew Cat()
, el objeto creado tendrá la__proto__
propiedad establecida en elprototype
objeto de la función constructora.Al final, juguemos un poco con este diagrama. Las siguientes afirmaciones son verdaderas:
tom.__proto__
la propiedad apunta al mismo objeto queCat.prototype
.Cat.__proto__
señala alFunction.prototype
objeto, al igual queFunction.__proto__
yObject.__proto__
hacer.Cat.prototype.__proto__
ytom.__proto__.__proto__
apuntan al mismo objeto y eso esObject.prototype
.¡Salud!
fuente
tom.__proto__
yCat.prototype
son estrictamente iguales, entonces,tom.__proto__ === Cat.prototype
yCat.prototype === tom.__proto__
son ciertas. Entonces, ¿qué quisiste decir con la flecha en la imagen?prototype
es propiedad delCat
objeto (de su pregunta).Definiciones
(el número dentro del paréntesis () es un 'enlace' al código que se escribe a continuación)
prototype
- un objeto que consiste en:=> funciones (3) de este particular
ConstructorFunction.prototype
(5) que son accesibles por cada objeto (4) creado o por crear mediante esta función constructora (1)=> la función constructora misma (1) )
=>
__proto__
de este objeto en particular (objeto prototipo)__proto__
(¿proto de proveedor?): un enlace ENTRE cualquier objeto (2) creado a través de una función de constructor particular (1), Y las propiedades del objeto prototipo (5) de ese constructor QUE permite que cada objeto creado (2) tenga acceso a las funciones del prototipo y métodos (4) (__proto__
se incluye por defecto en cada objeto en JS)CLARIFICACIÓN DEL CÓDIGO
1)
2)
3)
4)
5)
fuente
Probaré una explicación de cuarto grado:
Las cosas son muy simples. A
prototype
es un ejemplo de cómo se debe construir algo. Entonces:Soy
function
ay construyo nuevos objetos similares a miprototype
Soy un
object
y fui construido usando mi__proto__
como ejemploprueba :
fuente
prototype
ni__proto__
se utilizan en ningún momento como un plano o algo así para crear cualquier objeto. Este es un mito introducido por laclass
sintaxis borrosa y sus predecesores. Como dice el post de respuesta, solo se usa para la cadena de búsqueda y en caso deprototype
identificarseconstructor
connew
(que es parte de ese mecanismo de simulación de clase que está confundiendo a muchos usuarios, incluido yo).Cada función que crea tiene una propiedad llamada
prototype
, y comienza su vida como un objeto vacío. Esta propiedad no sirve de nada hasta que utilice esta función como función constructora, es decir, con la palabra clave 'new'.Esto a menudo se confunde con la
__proto__
propiedad de un objeto. Algunos pueden confundirse y, salvo que laprototype
propiedad de un objeto puede obtener el protocolo de un objeto. Pero este no es el caso.prototype
se usa para obtener__proto__
un objeto creado a partir de un constructor de funciones.En el ejemplo anterior:
Espero que tenga sentido.
fuente
prototype
no se usa para crear el__proto__
de un objeto.__proto__
, cuando se accede, simplemente proporciona una referencia alprototype
objeto.¿Qué pasa con el uso
__proto__
de métodos estáticos?fuente
__proto__
VS.prototype
en JavaScript" ?Prueba este código para entender
fuente
Solo hay un objeto que se usa para el encadenamiento protípico. Este objeto obviamente tiene un nombre y un valor:
__proto__
es su nombre yprototype
es su valor. Eso es todo.para que sea aún más fácil de entender, mire el diagrama en la parte superior de esta publicación (Diagrama de dmitry soshnikov), nunca encontrará
__proto__
puntos para otra cosa que no seaprototype
su valor.La esencia es esta:
__proto__
es el nombre que hace referencia al objeto prototípico, yprototype
es el objeto prototípico real.Es como decir:
x
es el nombre del objeto (puntero) y{name: 'john'}
es el objeto real (valor de datos).NOTA: esto es solo una pista enormemente simplificada sobre cómo se relacionan en un nivel alto.
Actualización: Aquí hay un ejemplo simple de JavaScript concreto para una mejor ilustración:
Esto significa que cuando
Object.getPrototypeOf(x)
nos obtiene el valor real dex
(que es su prototipo), es exactamente lo que el__proto__
dex
está apuntando. Por__proto__
lo tanto, de hecho está apuntando al prototipo dex
. Por lo tanto, hace__proto__
referenciax
(puntero dex
) yprototype
es el valor dex
(su prototipo).Espero que esté un poco claro ahora.
fuente
Esta es una pregunta muy importante relevante para cualquiera que quiera entender la herencia prototípica. Por lo que entiendo, el prototipo se asigna de manera predeterminada cuando se crea un objeto con nuevo de una función porque la función tiene un objeto prototipo por definición:
Cuando creamos un objeto ordinario sin recursos nuevos, es decir explícitamente de una función, que no tiene un prototipo pero tiene un vacío proto que se puede asignar un prototipo.
Podemos usar Object.create para vincular un objeto explícitamente.
fuente
__proto__
es la base para construirprototype
y una función constructora, por ejemplo:function human(){}
hasprototype
que se comparte a través__proto__
de la nueva instancia de la función constructora. Una lectura más detallada aquífuente
A medida que este declaró acertadamente
Además, podemos observar que la
__proto__
propiedad de un objeto creado utilizando el constructor de funciones apunta hacia la ubicación de la memoria apuntada por la propiedad prototipo de ese constructor respectivo.Si cambiamos la ubicación de la memoria del prototipo de la función del constructor, el
__proto__
objeto derivado seguirá apuntando hacia el espacio de direcciones original. Por lo tanto, para hacer que la propiedad común esté disponible en la cadena de herencia, siempre agregue la propiedad al prototipo de la función del constructor , en lugar de reinicializarla (lo que cambiaría su dirección de memoria).Considere el siguiente ejemplo:
fuente
mi entendimiento es: __proto__ y prototipo se sirven para la técnica de la cadena de prototipos. la diferencia es que las funciones nombradas con guión bajo (como __proto__) no están destinadas a los desarrolladores invocados explícitamente. en otras palabras, son solo para algunos mecanismos como heredar, etc. son 'back-end'. pero las funciones nombradas sin guión bajo están diseñadas para invocarse explícitamente, son 'front-end'.
fuente
__proto__
yprototype
, que solo la convención de nomenclatura. Pueden o no apuntar al mismo objeto. Ver @zyklus respuesta.¡¡¡ESTA ES LA MEJOR EXPLICACIÓN DEL MUNDO !!!!!
en los constructores de funciones, el motor de JavaScript lo llama
q.__proto__ = prototype
automáticamente cuando escribimosnew Class
, y en el__proto__
conjunto de accesoriosClass.prototype
Disfruta%)
fuente