2010-07-12 3 views
5

Sono relativamente nuovo all'utilizzo di oop in Javascript e mi sto chiedendo quale sia la procedura migliore per i metodi privati. In questo momento, sto usando mootools per creare le mie classi e sto simulando metodi privati ​​anteponendoli con un trattino basso e costringendomi a non chiamare il metodo al di fuori della classe. Quindi la mia classe assomiglia a:Metodi privati ​​in una classe Mootools

var Notifier = new Class(
{ 
    ... 
    showMessage: function(message) { // public method 
     ... 
    }, 

    _setElementClass: function(class) { // private method 
     ... 
    } 
}); 

Si tratta di un metodo valido/standard per gestire i metodi privati ​​in JS?

risposta

12

MooTools fornisce un metodo protect sulle funzioni, quindi è possibile chiamare la protezione su qualsiasi metodo che si desidera proteggere dall'essere chiamato all'esterno dello Class. Così si può fare:

​var Notifier = new Class({ 
    showMessage: function(message) { 

    }, 
    setElementClass: function(klass) { 

    }.protect() 
})​; 

var notifier = new Notifier(); 
notifier.showMessage(); 
notifier.setElementClass(); 
> Uncaught Error: The method "setElementClass" cannot be called. 

Non che class è un futuro parola chiave riservata in JavaScript e il codice potrebbe rompersi quando lo si utilizza. Certamente a questo punto si interrompe su Safari, ma il comportamento in altri browser non è garantito, quindi è meglio non utilizzare lo class come identificativo.

Un vantaggio dell'utilizzo di protect rispetto alla creazione di chiusure è che se si estende questa classe, è ancora possibile accedere ai metodi protetti in sottoclassi.

Notifier.Email = new Class({ 
    Extends: Notifier, 

    sendEmail: function(recipient, message) { 
     // can call the protected method from inside the extended class 
     this.setElementClass('someClass'); 
    } 
}); 

var emailNotifier = new Notifier.Email(); 
emailNotifier.sendEmail("a", "b"); 
emailNotofier.setElementClass("someClass"); 
> Uncaught Error: The method "setElementClass" cannot be called. 

Se si desidera utilizzare una convenzione di denominazione come prefisso o suffisso _ prima o dopo un metodo, allora va perfettamente bene pure. Oppure puoi combinare lo _ con i metodi protetti.

+0

Questo è esattamente quello che stavo cercando, grazie mille! Dovrò ricontrollare i documenti mootools la prossima volta. – aubreyrhodes

2

Bene, finché rimani coerente non avrai problemi.

C'è un modello però, per la creazione di una vera privacy in javascript tramite chiusura.

var Notifier = function() { 

    // private method 
    function setElementClass(class) { 
     //... 
    } 

    // public method 
    this.showMessage = function(message) { 
     // ... 
     setElementClass(...) // makes sense here 
    }; 
}; 

var noti = new Notifier(); 
noti.showMessage("something");  // runs just fine 
noti.setElementClass("smth else"); // ERROR: there isn't such a method 

Se si desidera aggiungere metodi pubblici che sono ereditati e condivisi tra tutti gli oggetti (minore occupazione di memoria), li si dovrebbe aggiungere al prototipo dell'oggetto.

// another way to define public functions 
// only one will be created for the object 
// instances share this function 
// it can also be used by child objects 
// the current instance is accessed via 'this' 
Notifier.prototype.showMessage = function() { 
    // ... 
    this.otherPublicFunction(...); 
};​ 

vi consiglio di guardare in modo grezzo di gestire oggetti in javascript, perché solo allora si sarà in grado di sapere cosa si sta facendo. Le lezioni di Mootools sarebbero buone per nascondere ciò che questa lingua differisce dagli altri. Ma la verità è che differisce così tanto che sarebbe ingenuo pensare di fare la stessa cosa quando si dice class in javascript, come in qualsiasi altra lingua OO basata su classi.