Antes de marcar mi pregunta como un duplicado de "¿Cuál es el prototipo es JavaScript?" tenga en cuenta que esta pregunta se centra en los prototipos de las clases ES6. Aunque la concepción de la cadena prototipo está involucrada, las implementaciones del mecanismo de herencia en ES5 están fuera de tema.
Desafortunadamente, la explicación general sobre la herencia y la cadena de prototipos no da una respuesta clara a mi pregunta. Por el contrario, crea nuevas preguntas.
No me importaron los prototipos de las clases hasta que no intenté crear el decorador (en la propiedad de clase no estática). En el caso de campos de propiedad de clase no estáticos, el primer parámetro de la función decoradora es el prototipo de la clase objetivo.
Desde el punto de vista de la explicación general, el prototipo de la clase objetivo es completamente inútil (al menos no entiendo qué hacer con él, incluso sé que este prototipo está relacionado con alguna clase), lo que parece ser valioso es la clase sí mismo.
export function VueReactiveField( classPrototype: unknown, // What it this? What we can do with it? fieldName: string ): void { }Además, el prototipo ha duplicado la complejidad. Si esta ecuación tenemos para las variables ahora:
Tenga en cuenta que la class , principalmente, es solo sintaxis para construir funciones de constructor y los objetos que asignan como prototipos a las instancias. No es un tipo diferente de herencia prototípica de las funciones constructoras. Es una forma diferente de escribirlos . (Además, ahora hay algunas características en la sintaxis de class que no están disponibles si escribe funciones de constructor de la manera anterior, como campos privados). Cubro esa parte de las cosas con más detalle en esta respuesta .
Por lo general , cuando alguien dice "el prototipo de la clase X", se refiere al objeto en la propiedad X.prototype . Podría decirse que esa frase no es del todo correcta (o al menos un poco imprecisa), pero es común.
Digamos que tienes:
class Parent { } class Child extends Parent { }Eso establece dos relaciones de herencia:
El objeto Child.prototype hereda de Parent.prototype . De esa forma, Child.prototype hereda las propiedades prototípicas (si las hay) y los métodos (mucho más comunes) que proporciona Parent.prototype .
La función Child hereda de la función Parent (sí, en serio). De esa manera, Child hereda cualquier característica estática que defina Parent .
P.ej:
Niño.prototipo −−−−> Padre.prototipo −−−−> Objeto.prototipo Hijo −−−−−−−−−−−−−−> Padre −−−−−−−−−−−−−−> Función.prototipo
Ejemplo:
class Parent { parentInstanceMethod() {} static parentStaticMethod() {} } class Child extends Parent { } console.log(Object.getPrototypeOf(Child.prototype) === Parent.prototype); // true console.log(Object.getPrototypeOf(Child) === Parent); // true console.log(typeof Child.prototype.parentInstanceMethod); // "function" console.log(typeof Child.parentStaticMethod); // "function"¿Cuál es la diferencia entre el prototipo de la clase N y la propia clase N en ECMAScript?
Depende de si te refieres al objeto en N.prototype o al prototipo real de la función N
Si te refieres a N.prototype : N es una función constructora, pero N.prototype es el objeto que se asignará como prototipo de las instancias de N creadas a través de la new N
Si quiere decir que el prototipo real de N : N es una función de constructor, pero su prototipo es el constructor de clase del que se deriva (o Function.prototype , si es una clase base).