我最近做了我自己的Javascript图书馆和我最初使用下列模式:

var myLibrary = (function () {

  var someProp = "...";

  function someFunc() {
    ...
  }

  function someFunc2() {
    ...
  }

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

}());

这个问题是,我真的不能使用代码的完成,因为IDE不知道有关性功能的文字是返回(我采用IDEA9通过的方式)。

我已经看过了。并试图做到这一点:

(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.bind 可能需要2或3个参数,并IDE似乎并不抱怨。我想做同样的事情与我的图书馆,其中一个功能可以采取0的参数或者1的论点。然而,IDE抱怨,并警告说,正确的数量参数不被发送。我怎么处理呢?

编辑

我开始不知道如果这是一个Idea9问题,因为jQuery具有同样的问题。我似乎没有这个问题在其他项目。

有帮助吗?

解决方案

我使用的是雅虎模块模式和自动完成我的作品的想法。谷歌雅虎模块图案。

http://www.yuiblog.com/blog/ 2007/06/12 /模块的模式/

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 I标记的地方,我试图自动完成。

在* 1我得到SOME_CONSTANT和privateStuff方法,和,如果我把这种(自动完成)1获得所有的方法和属性返回的内部{}块

当我尝试上* 2 I得到的所有内侧返回的方法和属性{}块的自动完成。 SOME_CONSTANT和privateStuff方法是invisibile那里,因为它们是 “私人”。

有关我自动完成的这个水平是相当精细。

其他提示

我认为将是巨大的,如果你读一些有关道格拉斯Crockford的。他是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。为什么重新发明轮子?

这是在回答评论 mwilcox后.

那个例子实际上将工作。由于 myLibrary 定义没有 var, 它被自动放到全球的名字空间,可作为这样的。通过关闭创建由自动执行的职能,私人变量和方法仍然可以在 myLibrary 方法。你可以很容易地试试这个了把它变成萤火虫或是犀牛。

这些天来,我不倾向于隐藏我的变量,即我用的是赝经典模式或原型模式和我的前缀 意图 私人的方法有一个 _:

// 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的名字空间。这种技术也用于由学习你可以看到,在他们的源代码(看看intro.js &outro.js)在 .

这会让你使用一种模式,允许你IDE(或ctags与vim)看到你的api,同时也防止污染的全球命名空间。

我写我的库是这样的:

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

new MyLibrary();

此方式,在Geany(使用CTAGS)MyLibrary是公认(在大多数情况下,例如,memberVar是公认的功能)和自动完成似乎工作。我不知道IDEA9,但你可以尝试这样说(我有一种预感,它比CTAGS多一点进化)。

我建议您不要使用私有变量,但我知道你想从他们的智能感知隐藏。这是我会怎么做:

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


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

})();

这样你就可以拥有你的私人的东西在关闭和你的库应该是可访问的。

[编辑。我笨拙地没有包括在MyLibrary在匿名函数,它看不到私人增值经销商。哎呀。 ]

顺便说一句,我的理由私有变量是坏:的http:// clubajax。组织/ JavaScript的私有变量-是邪/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top