Javascript模块模式:何时与方法私有化? getter / setter方法?改进的空间?

时间:2012-07-23 22:23:37

标签: javascript design-patterns module

我正在使用看起来像这样的模式(伪示例):

var FOO = (function(foo) {

    var foo = foo || {},
    setThis = 'someValue';

    //--------------------------------------------------------------------------
    //
    // Public methods:
    //
    //--------------------------------------------------------------------------

    foo.init = function(bar) {

        this.blah = [];

        // Constructor stuff here...

    };

    foo.doSomething = function(bar) {

        if (bar) {

            this.doSomethingElse();

            // Stuff here...

        }

    };

    foo.doSomethingElse = function() {

        // Stuff here...

    };

    //--------------------------------------------------------------------------
    //
    // Private methods:
    //
    //--------------------------------------------------------------------------

    foo._imPrivate = function() {

        // ... stuff here ...

        this.blah = xyz; // References this.

    };

    foo._morePrivate = function(el) {

        // No reference to this.

    };

    foo._otherPrivate = function(el) {

        // No reference to this.

    };

    return foo; // Expose the methods.

}(FOO || {}));

像这样诽谤:

window.onload = function() { FOO.init(stuff); }

三个问题:

  1. 如果我的“私人”方法没有引用this,我应该将它们作为“标准”函数(例如function _imPrivate() { ... })吗? 我问的原因:我有一些引用this的方法,但我不想让他们公开访问;我也有一些不引用this的“实用程序”方法......引用this的方法可以是标准函数(在模块模式的上下文中)吗?
  2. 有人可以提供一个如何为setThis变量实现setter的示例吗?
  3. 您是否看到上述代码有任何改进空间?

2 个答案:

答案 0 :(得分:3)

“私人”方法根本不是私有的,它们是公开的。 OP似乎没有利用使用立即调用的函数表达式(IIFE)提供的闭包。

函数this的值由您调用函数的方式设置,它不是静态的(除非您使用ES5绑定)。它与“上下文”无关(至少不是在ECMA-262中使用上下文的方式,这是在javascript的上下文中应该如何使用这个词)。

道格拉斯·克罗克福德的Private Members in JavaScript会有所帮助。

如果你发布了一个你想要做的事情的真实例子,你可能会获得更多关于如何在其实现中利用模块模式的帮助。

答案 1 :(得分:2)

1

您可以执行_imPrivate.call(this, arg1, arg2,...);

在这种情况下,this函数中的_imPrivate将引用特定的实例。

2

var setThis = 'someValue';

foo.setter = function(value) {
    setThis = value;
};