使用JavaScript范围函数了解New并传递$

时间:2012-10-18 22:35:17

标签: javascript jquery function

好的我在JavaScript范围功能和模块模式方面肯定学到了很多东西,真棒!现在我正在教我自己将jQuery传递给范围函数,这样它加载的速度更快,如果由于某种原因我有另一个使用$的框架,就不会有混淆。

但我还不完全理解的是,当我想传入jQuery时,何时在“范围函数的上下文”中创建一个“新”实例。这就是我的意思......如果我打算使用以下作为基础,它将返回pubs,它可以与一个或多个函数相关联,我得到它。

var DemoA = (function($) {
var pubs = {};
pubs.dosomething = //some function that calculates cool stuff with help of jquery
return pubs;
})(jQuery);

现在,当我尝试创建一个新实例....

var stuff = new DemoA();

...我通过Google Chrome开发者工具收到错误消息。它说“对象不是一个功能”或者那种效果。但如果我像这样直接打电话给DemoA ......

DemoA.dosomething();

...然后一切正常。这里发生了什么?为什么我不能创建一个新的实例变量?

提前感谢您帮助我变得更聪明!

2 个答案:

答案 0 :(得分:5)

查看您的return声明。您将返回如下所示的对象

{"dosomething": function () { }}

您无法创建对象的新实例。您可以直接调用dosomething,因为它是返回的对象的直接属性(方法)。

我想你想要这样的东西:

http://jsfiddle.net/veJqg/

var DemoA = (function($) {
    var pubs = function () {
        this.dosomething = function () {
            console.log("just executed `dosomething`");
        };
    };
    return pubs;
})(jQuery);

var a = new DemoA();
a.dosomething();

这样,您仍然将jQuery对象设置为$,并返回function,可以按照您想要的方式使用。

答案 1 :(得分:0)

通常使用的更复杂的jQuery示例:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
(function($) {

  $.DemoA = function(element, options) {
    var pubs = {};
    return pubs;
  }

  $.fn.DemoA = function(options) {
     return this.each(function() {
       (new $.DemoA($(this), options));
     });
   };

})(jQuery);

var i = new $.DemoA(item, {});
var j = $('<div>').DemoA();
</script>