394 votes

JavaScript méthodes privées

Pour faire une classe JavaScript avec une méthode publique que je ferais quelque chose comme:

function Restaurant()
{
}

Restaurant.prototype.buy_food = function()
{
   // something here
}

Restaurant.prototype.use_restroom = function()
{
   // something here
}

De cette façon, les utilisateurs de ma classe peut:

var restaurant = new Restaurant();
restaurant.buy_food();
restaurant.use_restroom();

Comment puis-je créer une méthode privée que mon public buy_food et use_restroom méthodes peuvent appeler, mais que les utilisateurs de la classe ne peut pas appeler à l'extérieur.

En d'autres termes, je veux que ma méthode mise en œuvre pour être en mesure de le faire:

Restaurant.prototype.use_restroom = function()
{
   this.private_stuff();
}

Mais cela ne devrait pas fonctionner:

var r = new Restaurant();
r.private_stuff();

Comment puis-je définir private_stuff comme une méthode privée de ceux qui détiennent le vrai?

J'ai lu Doug Crockford de writeup quelques fois, mais il ne semble pas comme "privé" méthodes peuvent être appelées par des méthodes publiques et les "privilégiés" méthodes peuvent être appelées de l'extérieur.

336voto

17 of 26 Points 15941

Vous pouvez le faire, mais l'inconvénient est qu'il ne peut pas être une partie de ce prototype:

function Restaurant()
{
    var myPrivateVar;

    var private_stuff = function()   // Only visible inside Restaurant()
    {
        myPrivateVar = "I can set this here!";
    }

    this.use_restroom = function()   // use_restroom is visible to all
    {
        private_stuff();
    }

    this.buy_food = function()    // buy_food is visible to all
    {
        private_stuff();
    }
}

149voto

georgebrock Points 9582

Vous pouvez simuler les méthodes privées comme ceci:

function Restaurant() {
}

Restaurant.prototype = (function() {
    var private_stuff = function() {
        // Private code here
    };

    return {

        constructor:Restaurant,

        use_restroom:function() {
            private_stuff();
        }

    };
})();

var r = new Restaurant();

// This will work:
r.use_restroom();

// This will cause an error:
r.private_stuff();

Plus d'informations sur cette technique ici: http://webreflection.blogspot.com/2008/04/natural-javascript-private-methods.html

32voto

Brian Reindel Points 6416

Dans ces situations, lorsque vous avez une API publique, et que vous souhaitez privé et public de méthodes/propriétés, j'ai toujours utiliser le Module de Modèle. Ce modèle a été rendu populaire au sein de l'YUI bibliothèque, et les détails peuvent être trouvés ici:

http://yuiblog.com/blog/2007/06/12/module-pattern/

Il est vraiment simple et facile pour les autres développeurs à comprendre. Pour un exemple simple:

var MYLIB = function() {  
    var aPrivateProperty = true;
    var aPrivateMethod = function() {
    	// some code here...
    };
    return {
    	aPublicMethod : function() {
    		aPrivateMethod(); // okay
    		// some code here...
    	},
    	aPublicProperty : true
    };  
}();

MYLIB.aPrivateMethod() // not okay
MYLIB.aPublicMethod() // okay

18voto

Sarath Points 890

Ici, c'est la classe que j'ai créé pour comprendre ce que Douglas Crockford a suggéré dans son site Privé des Membres en JavaScript

function Employee(id, name) { //Constructor
    //Public member variables
    this.id = id;
    this.name = name;
    //Private member variables
    var fName;
    var lName;
    var that = this;
    //By convention, we create a private variable 'that'. This is used to     
    //make the object available to the private methods. 

    //Private function
    function setFName(pfname) {
        fName = pfname;
        alert('setFName called');
    }
    //Privileged function
    this.setLName = function (plName, pfname) {
        lName = plName;  //Has access to private variables
        setFName(pfname); //Has access to private function
        alert('setLName called ' + this.id); //Has access to member variables
    }
    //Another privileged member has access to both member variables and private variables
    //Note access of this.dataOfBirth created by public member setDateOfBirth
    this.toString = function () {
        return 'toString called ' + this.id + ' ' + this.name + ' ' + fName + ' ' + lName + ' ' + this.dataOfBirth; 
    }
}
//Public function has access to member variable and can create on too but does not have access to private variable
Employee.prototype.setDateOfBirth = function (dob) {
    alert('setDateOfBirth called ' + this.id);
    this.dataOfBirth = dob;   //Creates new public member note this is accessed by toString
    //alert(fName); //Does not have access to private member
}
$(document).ready()
{
    var employee = new Employee(5, 'Shyam'); //Create a new object and initialize it with constructor
    employee.setLName('Bhaskar', 'Ram');  //Call privileged function
    employee.setDateOfBirth('1/1/2000');  //Call public function
    employee.id = 9;                     //Set up member value
    //employee.setFName('Ram');  //can not call Private Privileged method
    alert(employee.toString());  //See the changed object

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: