Necesito ayuda para entender la cadena de prototipos. No entiendo / no estoy muy seguro de si mis suposiciones son correctas. Quiero entender el enlace al Object.prototype. Un ejemplo
function A(){}; var newObject=new A();Sé que newObject tiene una propiedad interna [[prototype]] que hace referencia a A.prototype. Y este prototipo-Objeto también tiene una propiedad interna con referencia a Object.prototype, ¿verdad? Pero ¿por qué tiene esa referencia? ¿Es porque el prototipo de A (usado como constructor) es un objeto que se puede imaginar creado por A.prototype=new Object() (que se hará automáticamente en segundo plano)? ¿Y ahora tengo una referencia al prototipo de Object? Espero haberlo explicado claramente. Porfavor, dejame saber tus comentarios.
Muchas gracias
Sí, su comprensión es correcta.
En JS, casi todos los objetos tienen una referencia a Object.prototype en su cadena de prototipos.
El [[Prototype]] de un objeto se refiere a Object.prototype como el final de una cadena de prototipos. En su ejemplo, esto significa lo que describió:
[[Prototype]] [[Prototype]] newObject -----------------> A.prototype -----------------> Object.prototypeEso se aplica a...
Object (es decir, new Object(...) ),new Object() seguida de un montón de llamadas Object.defineProperty ) yA.prototype que se crea automáticamente cuando define la función A ).Sin embargo, también hay excepciones a esta "regla":
Object.prototype en sí mismo.
Si tuviera una referencia a... bueno, a sí mismo, crearía una recursividad infinita cuando se busca una propiedad inexistente. Por lo tanto, no tiene prototipo , lo que significa que su [[Prototype]] es null (así es como "termina" una cadena de prototipos).
Objetos personalizados creados con Object.create o modificados con Object.setPrototype .
El [[Prototype]] se puede establecer en cualquier cosa de esta manera, incluidos los objetos null u otros cuya cadena de prototipos no termina con Object.prototype .
De hecho, esto es lo que prescribe la especificación ECMAScript. Cuando se define una función con la palabra clave function , se crea un objeto a partir de Object.prototype que se asigna a la propiedad prototype de la función y, por lo tanto, se utilizará como prototipo para cualquier objeto construido por esa función.
Esta especificación se puede encontrar en Make Constructor , paso 5.a:
5.a. Establezca el prototipo en OrdinaryObjectCreate(%Object.prototype%).
Cuando se trata de javascript, cada valor es un objeto (matrices, objetos, conjuntos, mapas...) o una primitiva (Números, cadenas, booleanos...) los objetos y las primitivas son los dos tipos de datos en javascript a. Tiene los constructores Number, String, Array e incluso Object que puede usar para crear el valor correspondiente. Y cuando crea un objeto nuevo usando el operador nuevo, los siguientes pasos suceden consecutivamente:
// 1. Se crea un nuevo objeto vacío
// 2. Se llama a la función constructora y la palabra clave this se asigna al objeto vacío, es decir, this = {}.
// 3. El objeto vacío está vinculado al prototipo de la función constructora, es decir, {}. proto = constructorFunction.prototype.
// 4. la función constructora devuelve automáticamente el nuevo objeto {}.
tenga en cuenta que constructorFunction.prototype es el prototipo del nuevo objeto que se crea a partir de constructorFunction y no de sí mismo.
¡Espero que esto te aclare un poco las cosas!