我在Javascript中使用oop相对较新,我想知道私有方法的最佳实践是什么。现在,我正在使用mootools来创建我的类,我通过在前面添加下划线来强制私有方法,并强迫自己不要在类之外调用该方法。所以我的班级看起来像:
var Notifier = new Class(
{
...
showMessage: function(message) { // public method
...
},
_setElementClass: function(class) { // private method
...
}
});
这是处理JS中私有方法的好方法吗?
答案 0 :(得分:12)
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.
如果你想在方法之前或之后使用命名约定,例如前缀或后缀_
,那么这也很好。或者您也可以将_
与受保护的方法结合起来。
答案 1 :(得分:2)
好吧,只要你保持稳定,你就不会遇到麻烦。
有一种模式,用于通过闭包在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可以很好地隐藏这种语言与其他语言的不同之处。但事实是,它的差异如此之大,以至于当你在javascript中说class
时,如同在任何其他基于类的OO语言中说{{1}}时,你会做同样的事情是天真的。