Использование Class.create Prototype для определения частных / защищенных свойств и методов - PullRequest
1 голос
/ 22 мая 2009

Существует хороший обобщенный метод определения частных и защищенных свойств и методов в Javascript, здесь, на сайте . Однако в текущей версии Prototype (1.6.0) нет встроенного способа определения их через синтаксис Class.create().

Мне любопытно, что лучше всего делать, когда разработчики хотят определять частные и защищенные свойства и методы при использовании Prototype. Есть ли лучший способ, чем общий?

Ответы [ 3 ]

2 голосов
/ 22 мая 2009

Здесь есть обсуждение здесь в маяке Prototype, которое показывает, почему вы не можете получить этот эффект с помощью Class.create Prototype.

1 голос
/ 22 мая 2009

Что вы можете сделать, это использовать локальные переменные в функции-конструкторе (инициализировать) для прототипа, а затем создать замыкание, которое будет обращаться к этой переменной и предоставлять ее вашим открытым методам.

Вот пример кода:

// 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();
   }
});

Вот теория Дугласа Крокфорда по этому вопросу.

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

0 голосов
/ 19 февраля 2016

Ключ должен добавить открытые методы как замыкания, как в примере ниже:

 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
...