Я относительно плохо знаком с использованием ООП в JavaScript, и я задаюсь вопросом, что лучшая практика для закрытых методов. Прямо сейчас я использую mootools для создания моих классов, и я моделирую закрытые методы, снабжая префиксом их подчеркивание и вынуждая меня не назвать метод за пределами класса. Таким образом, мой класс похож:
var Notifier = new Class(
{
...
showMessage: function(message) { // public method
...
},
_setElementClass: function(class) { // private method
...
}
});
Действительно ли это - хороший/стандартный способ обработать закрытые методы в JS?
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.
Если вы хотите использовать соглашение об именовании, например, префикс или суффикс _
до или после метода, то это тоже вполне нормально. Или вы можете комбинировать _
с защищенными методами.
Что ж, пока вы остаетесь последовательными, вы не будете Попасть в беду.
Тем не менее, существует шаблон для создания настоящей конфиденциальности в 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, как и в любом другом объектно-ориентированном языке на основе классов.