Usando Class.create do Prototype para definir propriedades privadas / protegidas e métodos
-
23-08-2019 - |
Pergunta
Existe um método generalizado bom para definir propriedades e métodos privados e protegidos em Javascript, aqui no site . No entanto, a versão atual do Prototype (1.6.0) não tem um built-in maneira de defini-los através de sua Class.create()
sintaxe.
Estou curioso quais são as melhores práticas quando os desenvolvedores deseja definir propriedades e métodos privados e protegidos ao usar Prototype. Existe uma maneira melhor do que o genérico?
Solução
O que você pode fazer é usar variáveis ??locais em sua função de construtor (inicializar) para protótipo e, em seguida, a criação de um fecho que o acesso vontade / expor esta variável a seus métodos públicos.
Aqui está um exemplo 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();
}
});
Aqui está teoria Crockford Douglas sobre o assunto.
Outras dicas
Há uma discussão aqui no farol do protótipo que mostra que explica por que você não pode obter esse efeito com Class.create do protótipo.
A chave é para adicionar os métodos públicos como encerramentos, como no exemplo abaixo:
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