¿Cuál es el propósito del prototipo? [duplicar]

Resuelto Quinton Pike asked hace 13 años • 3 respuestas

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?

Quinton Pike avatar Dec 08 '11 22:12 Quinton Pike
Aceptado

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_namemé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 thiscontexto se establecerá en y se llamará someAnimalal 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.

Adam Rackis avatar Dec 08 '2011 15:12 Adam Rackis

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 namepropiedades diferentes set_name. Sin embargo, todos los objetos creados por la segunda función compartirán la set_namepropiedad.

 avatar Dec 08 '2011 15:12