javascript - herencia - ¿Cuál es el propósito del prototipo?
prototype javascript ejemplos (3)
Posible duplicado:
Entendiendo la herencia prototípica en JavaScript
OK, entonces soy algo nuevo en la idea de OOP en JS.
¿Cuál es la diferencia entre estos dos fragmentos de código escritos a continuación:
function animal(){
this.name = ''rover'';
this.set_name = function(name){
this.name = name;
}
}
function animal(){
this.name = ''rover'';
}
animal.prototype.set_name = function(name){
this.name = name;
}
Ambos hacen lo mismo, entonces ¿cuál es la diferencia?
El uso del prototipo facilita la creación de objetos, ya que esa función no tiene que volver a crearse cada vez que se crea un nuevo objeto.
Cuando haces esto:
function animal(){
this.name = ''rover'';
this.set_name = function(name){
this.name = name;
}
}
La función set_name
se crea de novo cada vez que creas un animal. Pero cuando haces esto
animal.prototype.set_name = function(name){
this.name = name;
}
La función no tiene que ser recreada cada vez; existe en un lugar en el prototipo. Entonces cuando llamas a someAnimal.set_name("Ubu");
el contexto se establecerá en someAnimal
y se someAnimal
la única función set_name
.
Sin embargo, hay una ventaja de usar la primera sintaxis: las funciones creadas de esta manera tendrán acceso a datos privados:
function animal(){
var privateData = ''foo''
this.name = ''rover'';
this.set_name = function(name){
this.name = name;
alert(privateData); //will alert ''foo''
}
}
Douglas Crockford llama a las funciones creadas como este "privilegiadas" por ese motivo: tienen acceso tanto a datos públicos como privados.
En el primer ejemplo, cada animal tiene una propiedad propia para la función set_name, mientras que en el segundo ejemplo comparten la misma función a través de su prototipo.
La ventaja de la primera versión es que los métodos pueden acceder a las variables locales (privadas) declaradas dentro del constructor.
La ventaja del segundo método es que necesita menos memoria (ya que solo almacena el método una vez en lugar de un millón de veces) y es más funcional en los motores JS actuales.
Usando el segundo método, también puede modificar o agregar métodos a una clase de manera que también afecte a las instancias que ya se crearon.
La diferencia aparece cuando creas un nuevo objeto a partir de estas funciones
var animal1 = new animal();
Todos los objetos creados por la primera función tendrán diferentes name
y propiedades de set_name
. Sin embargo, todos los objetos creados por la segunda función compartirán la propiedad set_name
.