2012-07-23 45 views
1

我,看起来像这样(伪例子)的模式工作:Javascript模块模式:何时使用私有方法? getter/setter方法?需要改进的地方?

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. 您是否看到有改进上述代码的空间?
+0

您可以使用'.call'或'.apply'为任何函数传递上下文。因此,项目#1不完全正确 – zerkms 2012-07-23 22:25:49

+0

您的私有方法是相当公开的。 – Bergi 2012-07-23 22:26:48

+0

为什么你会返回“mq”? – Bergi 2012-07-23 22:27:01

回答

2

1.

你可以做_imPrivate.call(this, arg1, arg2,...);

在这种情况下this_imPrivate功能将参照特定实例。

2.

var setThis = 'someValue'; 

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

太棒了!你摇滚!谢谢!!!!不要听起来像一个完全noob,但我如何在instanciate之前叫setter?实例化后,setter是否适用于该实例或所有创建的实例?谢谢!!!! – mhulse 2012-07-23 22:32:27

+0

@Micky Hulse:你所有的代码都是“静态的”。所以每个变量和方法都属于一个“类”,而不是一个实例 – zerkms 2012-07-23 22:44:53

+0

谢谢zerkms!我可能会问错误的问题:下面是一个[快速演示页面](http:// jsbin。com/oqojuy)(见控制台),这里是[代码](http://jsbin.com/oqojuy/edit)... **我现在看到setter适用于两个“实例”**(我有使用'New'关键字?)。有没有办法创建彼此独立的新实例?我使用正确的模式吗?在这一点上,我认为我需要做更多的研究(而不是错误),所以我感谢您提出的任何提示,我的主要问题已得到解答。 :) – mhulse 2012-07-24 00:17:14

3

的 “私人” 的方法是不是私人所有,他们是公众。 OP似乎没有采用立即调用的函数表达式(IIFE)所提供的闭包优势。

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

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

如果您发布了一个您正在尝试执行的实例,那么您可能会在如何在其实现中利用模块模式方面获得更多帮助。

+0

谢谢RobG!我非常感谢帮助。我正在研究您提到的关键字和链接。对不起,关于伪代码示例。我实际上正在分叉和修改一个GitHub repo的过程中......只要我检查到我的最新更改,我就会发布代码和工作示例的链接...我会回来的! :) – mhulse 2012-07-24 00:20:09

+0

这是[原始代码](https://github.com/JoshBarr/js-media-queries/blob/master/js/onmediaquery.js)。我正在做一个分支,但它还没有准备好分享......希望这有助于更好地解释事情? – mhulse 2012-07-24 22:24:57

+0

顺便说一句,感谢您对IIFE关键字的提示......这个词对我来说是新的。 [立即阅读](http://benalman.com/news/2010/11/immediately-invoked-function-expression/),有趣的东西!我会试着弄清楚如何利用IIFE(到目前为止对我而言并不明显)。 – mhulse 2012-07-24 22:29:21

相关问题