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?

¿Fue útil?

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.

http://www.crockford.com/javascript/private.html

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top