En JS, una función es un Objeto. Lleva un tiempo acostumbrarse a eso, pero es verdad. Tira eso un poco y el código que ves que otros usan tendrá más sentido. Si ha visto Javascript donde las personas pasan una función() {} como parámetro a otra función, eso es una prueba de que las funciones son objetos de primera clase.
Una vez que pueda entender esto (me tomó un tiempo), entonces necesita comprender que si realiza una función, puede obtener una nueva instancia de la misma. Consulte el siguiente código:
function FooName(){
var name;
this.setName = function(n){
this.name = n;
}
this.getName = function(){
return this.name;
}
}
var n1 = new FooName();
var n2 = new FooName();
n1.setName("FOO");
n2.setName("BAR");
En este punto, tiene dos instancias del método FooName: n1 y n2. Es una especie de convención en JS nombrar su función de creación de instancias con una primera letra mayúscula, en lugar de la primera letra minúscula del cliente. En este ejemplo, indico que mi función se puede instanciar nombrando FooName en lugar de fooName. Espero que esto tenga sentido.
En el ejemplo anterior, n1 tiene tres propiedades. Una propiedad de nombre privado, una propiedad setName pública y una propiedad pública getName. Cada vez que crea una instancia de un nuevo FooName, se crearán una copia de getName y setName. Eso puede desperdiciar espacio en la memoria. Como getName y setName no van a cambiar, no necesito una nueva copia para cada instancia de FooName. Aquí es donde entran los prototipos.
Puede decir lo siguiente, y luego getName y setName solo existirán una vez en la memoria, lo que liberará la memoria, lo que es bueno.
FooName.prototype.setName = function(n){
this.name = n;
}
FooName.prototype.getName = function(){
return this.name;
}
Si se quita la getNombre y setName de la función FooName, entonces ahora usted tendrá una FooName "clase" que tiene dos métodos, getNombre y setName.
Juega con ella.Déjeme saber si usted tiene preguntas.
No dice '(yet)' :(las clases todavía son de tipo strawman. Si tenemos suerte no entrarán en ES6! – Raynos