He leído e intentado entender otras respuestas similares a esta pregunta también ( como esta ), pero aún así el concepto de herencia prototípica no me queda muy claro. y en este momento lo que más me confunde es cuál es la diferencia real entre __proto__ y [[ Prototype ]] ? Por lo que he podido entender, es que [[ Prototype ]] es un " enlace interno que une un objeto con otro ". Pero se vuelve ambiguo cuando veo un tutorial en YouTube, porque cada vez que crean un objeto y si intentan registrarlo usando console.log en la consola de su navegador, en realidad tiene la propiedad __proto__ , pero cuando trato de hacer lo mismo genera [[ Prototype ]] en su lugar. entonces me gustaria saber por que es asi? y ¿qué es un " enlace interno "? ¡Gracias por adelantado! :) A continuación se muestra el código que genera "[[ Prototipo ]]" en Chrome y "<prototipo>" en Firefox.
function User(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } const user = new User("Someone", "Something"); console.log(user);La notación de doble corchete proviene de la especificación ECMAScript donde siempre se refiere a una entidad interna (campo, atributo, espacio,...) pero no es una notación que pueda usar en código JavaScript. Es información para el implementador del lenguaje y ayuda a definir con precisión el comportamiento del lenguaje.
En una consola puede ver información representada con estos corchetes dobles, como es el caso de la consola de Chrome. Firefox usa una notación diferente: <prototype> .
Ahora al núcleo de su pregunta. El vínculo entre un objeto y su objeto prototipo no es una propiedad de JavaScript propia de ese objeto. Es una ranura interna :
Las ranuras internas corresponden al estado interno asociado con objetos y utilizado por varios algoritmos de especificación ECMAScript. Las ranuras internas no son propiedades de objeto y no se heredan.
Puede obtener el objeto prototipo a través .__proto__ , pero esa propiedad __proto__ es un getter en el objeto Object.prototype . Eso es como correr en círculos: cuando escribes obj.__proto__ , el motor necesita saber cuál es la cadena del prototipo antes de que pueda encontrar ese valor de __proto__ para ti, ya que necesita obtenerlo por herencia, no es una propiedad del propio obj . Y para encontrar el enlace de herencia, el motor usará la "ranura" interna [[Prototype]] .
El prototipo de cada objeto se guarda en la ranura interna denominada [[prototype]] y __proto__ es solo un getter/setter, definido en el objeto Object.prototype , para obtener el valor de la ranura interna [[prototype]] de cualquier objeto.
Ejemplo:
const arr = []; Cada instancia de una matriz obtiene Array.prototype como su prototipo. Entonces, en la declaración anterior de arr , [[prototype]] ranura interna contiene una referencia a Array.prototype y en la siguiente expresión:
arr.__proto__ === Array.prototype // true arr.__proto__ obtiene el objeto Array.prototype de la ranura interna [[prototype]] .
Como se mencionó anteriormente, __proto__ es solo un getter/setter que obtiene el valor de la ranura interna [[prototype]] y solo está allí por razones de compatibilidad. No debe usarse en el código javascript moderno; Se deben usar los siguientes dos métodos para establecer/obtener el prototipo de cualquier objeto:
Hay otras ranuras internas, aparte de [[prototype]] , mencionadas en la especificación Ecmascript y estas ranuras internas no son accesibles por el código javascript que escribimos.
Si necesita saber más sobre las ranuras internas, lea: