2010-06-18 10 views
5

Estoy aprendiendo JavaScript, y no puedo entender por qué harías métodos que no son "privilegiados", es decir, que no están definidos en el constructor sino en el prototipo de la clase.¿por qué hacer métodos no privilegiados?

Entiendo la idea de encapsulación y todo, pero nunca encapsula partes de una clase del resto en el mundo OO.

Respuesta

18

Cuando se define una función en un constructor, se crea una nueva instancia de esa función cada vez que se llama al constructor. También tiene acceso a variables privadas.

var myClass = function() { 
    // private variable 
    var mySecret = Math.random(); 

    // public member 
    this.name = "Fred"; 

    // privileged function (created each time) 
    this.sayHello = function() { 
     return 'Hello my name is ' + this.name; 
     // function also has access to mySecret variable 
    }; 
} 

Cuando una función se define en el prototipo, la función se crea una sola vez y la única instancia de esa función es compartida.

var myClass = function() { 
    // private variable 
    var mySecret = Math.random(); 

    // public member 
    this.name = "Fred"; 
} 

// public function (created once) 
myClass.prototype.sayHello = function() { 
    return 'Hello my name is ' + this.name; 
    // function has NO access to mySecret variable 
}; 

Por lo que la definición de una función en el prototipo produce menos objetos que pueden proporcionarle un mejor rendimiento. Por otro lado, los métodos públicos no tienen acceso a variables privadas. Más ejemplos y razonamientos están disponibles aquí: http://www.crockford.com/javascript/private.html

+0

@aharon: Por las dudas: tenga cuidado con el uso de ['this'] (http://blog.niftysnippets.org/2008/04/you-must-remember -this.html). –

+0

Actualicé mi respuesta para hacer más clara la diferencia entre público, privado y privilegiado. – Greg

Cuestiones relacionadas