构建我的JS库,有几个问题

时间:2010-11-28 23:22:57

标签: javascript oop frameworks local-storage

我正在构建一个库(https://github.com/OscarGodson/storageLocker),更准确的是localStorage包装器,但因为这是我第一次尝试使用OO JavaScript,我还在学习,我有一个几个问题。

  1. 我在其他库中看到,有时候它们会将它们包装在一个匿名函数中。我,或者我应该这样做吗?如果是这样,如何不破坏任何东西?

  2. 对于内部API(基本上是内部函数)我应该如何编写它们?应该将它们添加到主对象,例如我的脚本中随机storageLocker.prototype.myInternalFunction()或只是myInternalFunction()?我不希望这些函数是全局的......例如,其中一个函数只检查JSON中的一堆项,查看它们的对象,然后检查对象类型是什么(如Date()然后转换它。

  3. 我应该如何/在哪里添加全局,我的脚本,变量?例如我有一个名为patterns的变量,就像var patterns = {"date":/\/Date\(([0-9]+)\)\//}我应该如何将其添加到我的脚本中?

  4. 非常感谢。我想以正确的方式编写我的脚本所以我问你们。我不知道当地的任何JS人员做过任何OO JS,他们都是老式的......

2 个答案:

答案 0 :(得分:3)

我会说:

1)此技术的目的不是污染全局命名空间。这是一件好事。    在下面的示例中,您可以看到与库的所有交互都是通过一个对象MyLibrary进行的。公共API是匿名函数的返回值。

var MyLibrary = function() {
// private
   this.InternalVariable = 'some value';

   function internalFunction(x,y) {
      return x + y;
      }

     function getInternalVariable() {
    return this.InternalVariable;
}
// public
   return {
      publicVariable : '1.0',
      publicFunction : function(x,y) {
         return x + y
         },
 accessInternalVariable : function() {

     return getInternalVariable();
     }
      }
   }();

2)另见上面关于如何放置“内部”功能的例子

3)如果你的全局变量是某种配置选项,我只需要公开setter / getter并保持变量“private”

答案 1 :(得分:2)

  

http://nefariousdesigns.co.uk/archive/2010/10/object-oriented-javascript-follow-up-part-2-technical/

有一个值得一读的命名空间。

  

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

也是另一个很好的概述。

有关优秀JavaScript实践的更多精彩内容,请查看

  

http://javascript.crockford.com/

在我们在评论中讨论后,我将示例更改为:

var storageLocker = function (selector) {

    var _selector = selector || "default value";

    function myPrivateFunction() {

    }

    var public = {

        get: function () {
            return _selector;
        },

        uppercase : function () {
            _selector = _selector.toUpperCase()
            return this;
        }

    }
    return public;

};

// use:
var test = storageLocker("search for this").uppercase().get();;

alert(test);

虽然这不是库/模块的一个示例(因为您通过直接调用构造函数来访问代码),但它是将相同的对象保留在范围内以进一步链接方法的示例。实际上它没有返回storageLocker对象,而是返回'public'对象,但是该对象可以通过关闭访问storageLocker的范围。

可能还有其他更好的方法可能会返回storageLocker对象本身,但这需要更多思考。