跨应用程序共享JS文件

时间:2014-04-03 23:48:53

标签: javascript

我们正在开发一个移动应用程序,我们正试图找出在整个应用程序中共享javascript函数的最佳方法。

目前我们的个人文件只包含:

var LIB = {
    URL: "http://localhost/service",
    connect: function() {
       // connect to server
      $.ajax({ url: this.URL }); // etc etc

      // call a private function?
      this._somethingElse();
    },
    _somethingElse: function() {
      // do something else
    }
};

然后我们简单地称之为:

LIB.connect();LIB.disconnect();

跨任何档案。

这也让我们也可以访问LIB.URL

我的问题是这种方法是否最好?

我见过人们也使用以下方法,但有什么好处?

var LIB = function () {
    this.URL = "http://localhost/service";
    this.connect = function () {
      var myself = this;
      // connect to server
      $.ajax({ url: this.URL }); // etc etc

      // call a private function?
      myself._somethingElse(); // best way to invoke a private function?
    };
    this._somethingElse = function () {
      // do something else
    };
};

这需要以下内容:

var lib = new LIB();

lib.connect();

修改

我也看到了以下内容:

window.lib = (function () {
    function Library () {
    }

    var lib = {
        connect: function () {
          // connect to server
        }   
    };

    return lib;
}());

我对所有这些选项感到有些困惑。

3 个答案:

答案 0 :(得分:2)

这取决于你更喜欢哪个。我(在个人层面上)更喜欢前者,而是每个人都喜欢。后者确实有缺点,要么在使用之前要么记住声明new,要么必须跟踪已经创建的{{1}}。

此外,在技术层面上,第一个应该略微(因为,几乎不可察觉)性能,因为您不必计算新功能。

修改是的,第一种方式是definitely the fastest

答案 1 :(得分:1)

我强烈建议使用模块系统。在ES6出现之前(http://wiki.ecmascript.org/doku.php?id=harmony:modules),您必须使用第三方库才能执行此操作。

  • 每个object / class / util / etc都是一个模块。

  • 模块导出公共API,而消费模块通过声明其依赖项导入其他模块。

  • 两个"标准"存在:AMD和CommonJS。在浏览器中,像RequireJS这样使用AMD标准的库很受欢迎。我建议先查看他们的网站:http://requirejs.org/并查看他们的示例。

这里的主要优点是您只公开公共API,它允许您创建功能的沙箱。它也更加明确,因为它很容易看出你的模块所依赖的东西,而不是依赖于全局对象。

答案 2 :(得分:0)

有几种不同的方法可以构建JavaScript代码以实现可重用性。你可以研究这些并决定哪个是最好的。就我个人而言,我使用了您已经概述的第二种方法。但是,我将代码分成几部分,实际上遵循MVVM结构。例如,我有一个名为模型和视图模型的名称空间。我的每个js文件都以:

开头

window.[APP NAME].Models.[CLASS/MODULE NAME] or window.[APP NAME].Models.[CLASS/MODULE NAME]

所以,让我们说我有一个名为mynamespace的命名空间,我有一个名为myclass的模块/类。我的js文件将以:

开头
window.MYNAMESPACE = window.MYNAMESPACE || {};
window.MYNAMESPACE.ViewModels = window.MYNAMESPACE.ViewModels || {};

window.MYNAMESPACE.ViewModels.MyClass = function () {
    // a public function
    this.func1 = function () {
    };

    // a private function
    function func2() {
    }
};

然后我会通过调用

来使用该类
var myClassModel = new window.MYNAMESPACE.ViewModels.MyClass();
myClassModel.func1();

这为您提供了一些很好的代码封装。您可以研究/谷歌的其他一些模式是:原型模式,模块模式,揭示模块模式和揭示原型模式。

我希望这会有所帮助,但如果您对我刚才所说的内容有任何疑问,请随时对此帖发表评论。