Utilizzando un Prototipo di Classe.creare per definire private/protected proprietà e metodi
-
23-08-2019 - |
Domanda
C'è un buon metodo generalizzato per la definizione di privato e protetto metodi e proprietà in Javascript, qui sul sito.Tuttavia, l'attuale versione del Prototipo (1.6.0) non hanno un built-in modo da definire attraverso la propria Class.create()
la sintassi.
Sono curioso di sapere quali sono le migliori pratiche in cui gli sviluppatori di voler definire privato e protetto proprietà e metodi quando si utilizza Prototipo.C'è un modo migliore rispetto al generico?
Soluzione
Che cosa si può fare è usare le variabili locali nella funzione di costruzione (inizializzare) per il prototipo e quindi la creazione di una chiusura che avrà accesso/esporre questa variabile per i tuoi metodi pubblici.
Ecco un esempio di codice:
// properties are directly passed to `create` method
var Person = Class.create({
initialize: function(name) {
// Protected variables
var _myProtectedMember = 'just a test';
this.getProtectedMember = function() {
return _myProtectedMember;
}
this.name = name;
},
say: function(message) {
return this.name + ': ' + message + this.getProtectedMember();
}
});
Ecco Douglas crockford teoria sull'argomento.
Altri suggerimenti
C'è una discussione qui nel Prototipo del faro che indica che spiega perché non è possibile ottenere questo effetto con il Prototipo di Classe.creare.
La chiave è quello di aggiungere i metodi pubblici, come le chiusure, come nell'esempio di seguito:
Bird = Class.create (Abstract,(function () {
var string = "...and I have wings"; //private instance member
var secret = function () {
return string;
} //private instance method
return {
initialize: function (name) {
this.name = name;
}, //constructor method
say: function (message) {
return this.name + " says: " + message + secret();
} //public method
}
})());
Owl = Class.create (Bird, {
say: function ($super, message) {
return $super(message) + "...tweet";
} //public method
})
var bird = new Bird("Robin"); //instantiate
console.log(bird.say("tweet")); //public method call
var owl = new Owl("Barnie"); //instantiate
console.log(owl.say("hoot")); //public method call inherit & add