Estoy tratando de entender cómo funciona la herencia prototípica cuando uso funciones de constructor en Javascript. Tome el siguiente código, por ejemplo:
let Animal = function (name, species, birthYear) { this.name = name; this.species = species; this.birthYear = birthYear; }; let spike = new Animal(`Spike`, `Dog`, 2000); Animal.prototype.calculateAge = function () { let age = 2022 - this.birthYear; return age; }; Animal.prototype.color = `brown`; spike.calculateAge(); console.log(spike.color); console.log(spike);Estas últimas tres líneas son lo que me cuesta entender. Por favor, hágame saber si mi comprensión está equivocada en algún punto de mi explicación.
Puedo llamar al método de cálculo de edad () en el objeto de pico porque heredó el método del prototipo Animal. De manera similar, puedo registrar la propiedad de color de picos en la consola porque el objeto de pico heredó la propiedad de color del prototipo Animal. Cuando inspecciono el objeto de pico usando console.log(), tiene las propiedades de nombre, especie y año de nacimiento que definí, pero también hay un prototipo. ¿Significa esto que el objeto de pico contiene el prototipo, o simplemente identifica el prototipo del que heredó el método y la propiedad antes mencionados? Además, realmente no siento que entiendo qué es este prototipo Animal. Entiendo que el código funciona y eso está muy bien, pero ¿qué diablos es este prototipo de Animal? ¿Es su propio objeto en sí mismo?
Gracias por cualquier explicación que pueda ofrecer.
Creo que primero debe comprender profundamente el paradigma orientado a objetos detrás de Javascript.
Javascript es un lenguaje de programación orientado a objetos basado en prototipos.
Las operaciones se codifican en la estructura de datos prototipo en un lenguaje prototipo, que se copia y actualiza en tiempo de ejecución. Sin embargo, una clase sigue siendo la clase de equivalencia para todos los objetos con el mismo espacio de estado y métodos cuando se ve de forma abstracta. Estás creando efectivamente un elemento de una nueva clase de equivalencia cuando agregas un método al prototipo.
Entonces, ¿por qué estás haciendo eso? Principalmente porque da como resultado un sistema de tiempo de ejecución que es sencillo, lógico y elegante. Para crear un nuevo objeto o clase, simplemente haga una copia profunda, que copia todos los datos, así como la estructura de datos del prototipo. Entonces obtiene herencia y polimorfismo por casi nada: una búsqueda de método siempre implica solicitar una implementación de método por nombre de un diccionario.
Para ser más específicos, JavaScript es un lenguaje orientado a objetos basado en prototipos, lo que significa que no tiene clases y en su lugar define comportamientos mediante funciones de construcción, que luego se pueden reutilizar utilizando el prototipo.