Частные методы в классе Mootools - PullRequest
5 голосов
/ 12 июля 2010

Я относительно новичок в использовании oop в Javascript, и мне интересно, как лучше всего использовать частные методы. Прямо сейчас я использую mootools для создания своих классов, и я имитирую закрытые методы, добавляя к ним подчеркивание и заставляя себя не вызывать метод вне класса. Итак, мой класс выглядит так:

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

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

Это хороший / стандартный способ обработки частных методов в JS?

Ответы [ 2 ]

12 голосов
/ 12 июля 2010

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

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

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

2 голосов
/ 12 июля 2010

Ну, пока вы будете последовательны, у вас не будет проблем.

Существует шаблон для создания истинной конфиденциальности в javascript через closure .

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, как и в любом другом языке ОО на основе классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...