Mootools类中的私有方法

时间:2010-07-12 13:45:20

标签: javascript oop mootools

我在Javascript中使用oop相对较新,我想知道私有方法的最佳实践是什么。现在,我正在使用mootools来创建我的类,我通过在前面添加下划线来强制私有方法,并强迫自己不要在类之外调用该方法。所以我的班级看起来像:

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

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

这是处理JS中私有方法的好方法吗?

2 个答案:

答案 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}}时,你会做同样的事情是天真的。