7

当前用于实现JQuery 命名空间以托管通用实用程序功能的一些“经验法则”是什么?

我有许多分散在各种文件中的 JavaScript 实用程序方法,我想将它们合并到一个(或多个)命名空间中。最好的方法是什么?

我目前正在研究两种不同的语法,按优先顺序列出:

  //******************************
  // JQuery Namespace syntax #1
  //******************************
  if (typeof(MyNamespace) === "undefined")
  {
     MyNamespace = {};
  }

  MyNamespace.SayHello = function ()
  {
     alert("Hello from MyNamespace!");
  }

  MyNamespace.AddEmUp = function (a, b)
  {
     return a + b;
  }

  //******************************
  // JQuery Namespace syntax #2
  //******************************
  if (typeof (MyNamespace2) === "undefined")
  {
     MyNamespace2 =
     {
        SayHello: function ()
        {
           alert("Hello from MyNamespace2!");
        },

        AddEmUp: function (a, b)
        {
           return a + b;
        }
     };
  }

语法 #1 更冗长,但看​​起来更容易维护。我不需要在方法之间添加逗号,我可以左对齐我的所有函数。

还有其他更好的方法吗?

4

2 回答 2

3

对于 jQuery 插件等,$.fn.myPlugin如果您希望它在元素上可用,并且$.whatever如果您只想使用命名空间,则使用该模式。我建议阅读官方插件创作文档这些 文章

但是除了 jQuery,命名你的 utils 的最简单方法是沿着这些线:

var utils = window.utils || {};
utils.method = function(){};

JS 中命名空间的基础知识最近并没有真正改变——你应该查看snook 的文章DED 的优雅方法这个 SO question

使用自调用函数来声明命名空间的主要优点是您可以在返回对象之前私下执行内容。此外,该对象将准备好由您的控制台自动完成,您将在$命名空间中错过它,因为 jQuery 返回一个函数而不是一个对象。

于 2011-05-14T22:20:48.883 回答
1

作为记录,我最终使用了第一种语法:

$(function ()
{
   //********************************
   // PREDIKT NAMESPACE
   //********************************

   if (typeof (Predikt) === "undefined")
   {
      Predikt = {};
   }

   //********************************
   // PREDIKT.TIMER NAMESPACE
   //********************************

   if (typeof (Predikt.Timer) === "undefined")
   {
      Predikt.Timer = {};
   }

   Predikt.Timer.StartTimer = function ()
   {
      return new Date().getTime();
   };

   Predikt.Timer.EndTimer = function ()
   {
      return new Date().getTime();
   };

});
于 2011-06-04T07:04:26.447 回答