¿Cuál es el propósito del prototipo? [duplicar]
Posible duplicado:
¿Uso de 'prototipo' versus 'esto' en JavaScript?
Bien, soy algo nuevo en la idea de programación orientada a objetos 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, ¿cuál es la diferencia?
El uso del prototipo agiliza la creación de objetos, ya que no es necesario volver a crear las propiedades/métodos del prototipo cada vez que se crea un nuevo objeto.
Cuando haces esto:
function animal() {
this.name = 'rover'
this.set_name = function (name) {
this.name = name
}
}
El set_name
método se crea cada vez que creas un animal. Pero cuando haces esto
animal.prototype.set_name = function (name) {
this.name = name
}
No es necesario volver a crear el método cada vez; existe en un lugar del prototipo. Entonces, cuando llame, someAnimal.set_name("Ubu");
el this
contexto se establecerá en y se llamará someAnimal
al método (único) .set_name
Sin embargo, hay una ventaja al usar la primera sintaxis: los métodos creados 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 los métodos creados así "privilegiados" por esa razón: tienen acceso a datos tanto públicos como privados.
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 name
propiedades diferentes set_name
. Sin embargo, todos los objetos creados por la segunda función compartirán la set_name
propiedad.