3

我最近制作了自己的 Javascript 库,最初使用以下模式:

var myLibrary = (function () {

  var someProp = "...";

  function someFunc() {
    ...
  }

  function someFunc2() {
    ...
  }

  return {
     func: someFunc,
     fun2: someFunc2,
     prop: someProp;
  }

}());

这样做的问题是我不能真正使用代码完成,因为 IDE 不知道函数文字返回的属性(顺便说一下,我使用的是 IntelliJ IDEA 9)。

我查看了 jQuery 代码并尝试这样做:

(function(window, undefined) {
    var myLibrary = (function () {

      var someProp = "...";

      function someFunc() {
        ...
      }

      function someFunc2() {
        ...
      }

      return {
         func: someFunc,
         fun2: someFunc2,
         prop: someProp;
      }

    }());

    window.myLibrary = myLibrary;
}(window));

我试过这个,但现在我有一个不同的问题。IDE 也没有真正接受myLibrary

我现在解决问题的方式是这样的:

var myLibrary = {
   func: function() { },
   func2: function() { },
   prop: ""
};

myLibrary = (function () {

  var someProp = "...";

  function someFunc() {
    ...
  }

  function someFunc2() {
    ...
  }

  return {
     func: someFunc,
     fun2: someFunc2,
     prop: someProp;
  }

}());

但这似乎有点笨拙,我无法完全弄清楚 jQuery 是如何做到的。我的另一个问题是如何处理具有任意数量参数的函数。

例如,jQuery.bind可以带 2 或 3 个参数,IDE 似乎没有抱怨。我尝试对我的库做同样的事情,其中​​一个函数可以接受 0 个参数或 1 个参数。但是,IDE 会抱怨并警告未发送正确数量的参数。我该如何处理?

编辑

我开始怀疑这是否是一个 Idea9 问题,因为 jQuery 也有同样的问题。不过,我在其他项目中似乎没有这个问题。

4

5 回答 5

3

我正在使用带有雅虎模块模式的 IDEA,并且我的自动完成功能有效。Google for yahoo 模块模式。

http://www.yuiblog.com/blog/2007/06/12/module-pattern/

http://ajaxian.com/archives/a-javascript-module-pattern


TEST = function() {
    var SOME_CONSTANT='asd';

    function privateStuff(){
        var a = 'asd';
        return a;
    }

    return{
        someArray:[],

        someMethod: function(foo, bar){

            var foo = *1
        }
        ,

        myProperty:'test'
    }
}();

TEST.*2

用 *1 和 *2 我标记了我尝试自动完成的地方。

在 *1 我得到 SOME_CONSTANT 和 privateStuff 方法,如果我把这个(自动完成)我可以访问 return {} 块内的所有方法和属性

当我在 *2 上尝试自动完成时,我得到了 return {} 块内的所有方法和属性。SOME_CONSTANT 和 privateStuff 方法在那里是不可见的,因为它们是“私有的”。

对我来说,这种级别的自动完成非常好。

于 2010-04-01T23:21:42.623 回答
1

如果你能读到一些关于道格拉斯·克罗克福德的文章,我想会很棒。他是 yahou YUI 框架的架构师。之后,您可以更好地了解如何构建出色的框架。对于参数,有 2 个选项。1.- 通过对象发送示例

{ option :{ var1 : "value" , var2:"value"}, var3 : "value" }

您可以检查该选项是否存在。

第二个不太好是检查参数是否未定义。

function foo(var1,var2){
   var var1_this = null;
     if(var1 != undefined)
      var1_this = var1;
}

只是评论为什么要构建一个新的javascript框架?使用原型,JQuery,Mootols,YUI。为什么要重新发明轮子?

于 2010-04-02T06:07:48.643 回答
1

这是对mwilcox 帖子的评论的回复。

该示例实际上会起作用。由于myLibrary没有定义var,它会自动放入全局命名空间并可以访问。通过自执行函数创建的闭包,仍然可以在方法中访问私有变量和myLibrary方法。您可以通过将其放入 Firebug 或 Rhino 轻松地尝试一下。

这些天来,我不倾向于隐藏我的变量,即我使用 Pseudoclassical 模式或 Prototypal 模式,并在我想要的私有方法前面加上_

// Pseudoclassical pattern
function Hello() {}
Hello.prototype = {
    method1: function() {},
    method2: function() {},
    _pseudeoPrivate: function() {}
};

/* Prototypal pattern. To create multiple instances of this object,
   you need a helper function such as
    function beget(o) {
        var F = function() {};
        F.prototype = o;
        return new F;
    }
    var instance = beget(world);
*/
var world = {
    method1: function() {},
    method2: function() {}
};

为了防止我的代码污染全局命名空间,我有一个构建过程,它将我的模块包装在一个闭包中并将公共 api 导出到命名空间。jQuery 也使用了这种技术。您可以在Github上的源代码(查看 intro.js 和 outro.js)中看到这一点。

这将允许您使用允许您的 IDE(或带有 vim 的 ctags)查看您的 api 的模式,同时还可以防止全局命名空间的污染。

于 2010-08-06T09:43:02.647 回答
0

我建议您不要使用私有变量,但我知道您希望它们对智能感知隐藏。我会这样做:

(function(){
    var privateVar = "shhhh!";
    var privateMethod = function(){}


    myLibray = {
        prop:42,
        foo: function(){
            return privateMethod()
        },
        bar: function(){
            return privateVar;
        }
    }

})();

这样你就可以把你的私人东西放在一个闭包中,并且你的库应该是可以访问的。

[已编辑。我笨拙地没有在匿名函数中包含 myLibrary 并且它看不到私有变量。哎呀。]

顺便说一句,我认为私有变量不好的原因: http: //clubajax.org/javascript-private-variables-are-evil/

于 2010-04-02T01:30:44.413 回答
0

我这样写我的库:

function MyLibrary() {
    // code
}
MyLibrary.prototype.memberFunc = function() {
    // code
}
MyLibrary.prototype.memberVar = 5;

new MyLibrary();

这样,在 Geany(使用 CTAGS)MyLibrary中得到了很好的识别(例如,在大多数情况下,memberVar 被识别为一个函数)并且自动完成似乎可以工作。我不知道 IDEA9,但你可以这样尝试(我有预感它比 CTAGS 更进化一些)。

于 2010-04-02T17:18:38.020 回答