Sé que para vincular una propiedad a una función, debe agregarla a su prototipo. Por ejemplo:
function Animal(name) { this.name = name; }; Animal.prototype.number = 20; Animal.prototype.bark = function() {console.log('Woof')}; let mike = new Animal('Mike'); console.log(mike.number) mike.bark();Tal vez esta sea una pregunta muy ingenua, pero ¿por qué no se le permite vincular una propiedad a la función en sí? Por ejemplo, haciendo lo siguiente:
function Animal(name) { this.name = name; }; Animal.bark = function() {console.log('Woof')}; Animal.number = 20; let mike = new Animal('Mike'); console.log(mike.number) mike.bark();Los objetos en JavaScript usan herencia prototípica. Cada objeto hereda de algún otro objeto, o de null . Esta cadena continúa: todos los objetos finalmente heredan de null .
Si un objeto hereda de otro, todas las propiedades disponibles en el objeto principal estarán disponibles en el objeto secundario (a menos que el objeto secundario defina una propiedad con el mismo nombre, sombreando y ocultando efectivamente el nombre en el principal).
Si instancias de Animal heredadas de Animal mismo, como con
function Animal(name) { this.name = name; }; Animal.bark = function() {console.log('Woof')}; Animal.number = 20; Entonces, las instancias de Animal heredarían de function Animal , que es una función, y serían funciones y también heredarían .call , .apply , etc. Esto casi nunca es lo que querría un desarrollador.
Tener un objeto controlable separado del que heredan las instancias tiene más sentido, y se decidió hacer referencia a ese objeto a través de <functionName>.prototype .
La cadena prototipo es:
instance <- Animal.prototype <- Object.prototypey
Animal <- Function.prototype <- Object.prototype Tener instancias también heredadas de Function.prototype y ser funciones simplemente no tendría sentido. Uno casi siempre quiere objetos ordinarios como instancias, no funciones invocables.
Otro beneficio de tener Animal.prototype separado de Animal es que puede tener propiedades en el prototipo y propiedades en la función o clase en sí, lo cual es una buena manera de separar los valores y métodos de instancia de los valores y funciones de utilidad, que están asociados. con la clase, pero no tienen que ver con ninguna instancia en particular.
function Animal(name) { this.name = name; }; Animal.prototype.bark = function() {console.log(this.name + ' says Woof')}; Animal.checkIsAnimal = function(possibleAnimal) { console.log('Is this an animal? ' + (possibleAnimal instanceof Animal)); }; const mike = new Animal('Mike'); Animal.checkIsAnimal({}); Animal.checkIsAnimal(mike);