Usando Class.create de Prototipo para definir las propiedades privadas / protegidas y métodos
-
23-08-2019 - |
Pregunta
No es un buen método generalizado para la definición de las propiedades y métodos privados y protegidos en Javascript, aquí en el sitio . Sin embargo, la versión actual del prototipo (1.6.0) no tiene una forma integrada de definirlos a través de su sintaxis Class.create()
.
Tengo curiosidad por lo son las mejores prácticas cuando los desarrolladores quieren definir propiedades y métodos privados y protegidos cuando se utilizan Prototipo. ¿Hay una manera mejor que el genérico?
Solución
Lo que puede hacer es el uso de variables locales en su función constructora (inicializar) para la creación de prototipos y luego un cierre que tendrá acceso / exponer esta variable en sus métodos públicos.
Aquí hay un ejemplo de código:
// 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();
}
});
Esta es la teoría Crockford Douglas sobre el tema.
Otros consejos
Hay una discusión aquí en el faro de prototipo que muestra que explica por qué no se puede conseguir este efecto con Class.create de Prototipo.
La clave es añadir los métodos públicos como cierres, como en el siguiente ejemplo:
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