我们正在开发一个移动应用程序,我们正试图找出在整个应用程序中共享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;
}());
我对所有这些选项感到有些困惑。
答案 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();
这为您提供了一些很好的代码封装。您可以研究/谷歌的其他一些模式是:原型模式,模块模式,揭示模块模式和揭示原型模式。
我希望这会有所帮助,但如果您对我刚才所说的内容有任何疑问,请随时对此帖发表评论。