Закрытые методы в классе Mootools

Я относительно плохо знаком с использованием ООП в JavaScript, и я задаюсь вопросом, что лучшая практика для закрытых методов. Прямо сейчас я использую mootools для создания моих классов, и я моделирую закрытые методы, снабжая префиксом их подчеркивание и вынуждая меня не назвать метод за пределами класса. Таким образом, мой класс похож:

var Notifier = new Class(
{
   ...
   showMessage: function(message) { // public method
      ...
   },

   _setElementClass: function(class) { // private method
      ...
  }
});

Действительно ли это - хороший/стандартный способ обработать закрытые методы в JS?

5
задан aubreyrhodes 12 July 2010 в 13:45
поделиться

2 ответа

MooTools предоставляет protect метод для функций, поэтому вы можете вызвать protect для любого метода, который вы хотите защитить от вызова вне класса. Таким образом, вы можете сделать:

​var Notifier = new Class({
    showMessage: function(message) {

    },
    setElementClass: function(klass) {

    }.protect()
})​;

var notifier = new Notifier();
notifier.showMessage();
notifier.setElementClass();
> Uncaught Error: The method "setElementClass" cannot be called.

Не забывайте, что class является будущим зарезервированным ключевым словом в JavaScript, и ваш код может сломаться при его использовании. На данный момент он точно ломается в Safari, но поведение в других браузерах также не гарантировано, поэтому лучше вообще не использовать class в качестве идентификатора.

Одно из преимуществ использования protect перед самостоятельным созданием закрытых методов заключается в том, что если вы расширите этот класс, вы все равно сможете получить доступ к защищенным методам в подклассах.

Notifier.Email = new Class({
    Extends: Notifier,

    sendEmail: function(recipient, message) {
        // can call the protected method from inside the extended class
        this.setElementClass('someClass');
    }
});

var emailNotifier = new Notifier.Email();
emailNotifier.sendEmail("a", "b");
emailNotofier.setElementClass("someClass");
> Uncaught Error: The method "setElementClass" cannot be called.

Если вы хотите использовать соглашение об именовании, например, префикс или суффикс _ до или после метода, то это тоже вполне нормально. Или вы можете комбинировать _ с защищенными методами.

12
ответ дан 18 December 2019 в 13:10
поделиться

Что ж, пока вы остаетесь последовательными, вы не будете Попасть в беду.

Тем не менее, существует шаблон для создания настоящей конфиденциальности в javascript с помощью закрытия .

var Notifier = function() {

    // private method
    function setElementClass(class) { 
        //...
    }

    // public method
    this.showMessage = function(message) {
        // ...
        setElementClass(...) // makes sense here
    };
};

var noti = new Notifier();
noti.showMessage("something");     // runs just fine
noti.setElementClass("smth else"); // ERROR: there isn't such a method

Если вы хотите добавить общедоступные методы, которые наследуются и используются всеми объектами (меньший объем памяти), вы должны добавить их в прототип объекта.

// another way to define public functions
// only one will be created for the object
// instances share this function
// it can also be used by child objects
// the current instance is accessed via 'this'
Notifier.prototype.showMessage = function() {
   // ...
   this.otherPublicFunction(...);
};​

Я рекомендую вам изучить необработанный способ обработки объектов в javascript, потому что только тогда вы сможете узнать, что делаете. Mootools, как классы, были бы хороши, чтобы скрыть, чем этот язык отличается от других. Но правда в том, что они отличаются настолько сильно, что было бы наивно думать, что вы делаете то же самое, когда говорите class в javascript, как и в любом другом объектно-ориентированном языке на основе классов.

2
ответ дан 18 December 2019 в 13:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: