我有一个包含大量全局对象的javascript文件。也就是说,我有很多以下类型的代码:
var foo = 5;
var bar = "string";
var getStuff = function () {
//...getStuff
}
问题:将此文件的全部内容放入对象中,最简单的方法是什么?
在我看来,我的选择如下:
将整个文件包裹在var Object = { ... };
中。问题是我必须改变声明变量和函数的语法。
在每个声明之前手动前缀Object.xxx
。这也是很多手工工作,并且使事情略显冗长。
有更好的方法吗?或者如果没有,是否有理由更喜欢(1)或(2)?
答案 0 :(得分:1)
我想你想要这样
var someObject = function (window, document, undefined) {
/*you code...etc here*/
return {
method1 : your_method...,
method2 : your_method...,
method2 : your_method...,
object : your_object...
}
} (window, document);
这里传递窗口和文档的原因是使它成为局部变量而不是外部变量,以最小化查找变量的成本。 大多数js引擎现在可以自己处理,所以现在可能不是真的需要。以防这个代码可能在一个非常古老的浏览器上运行。
未定义传递方式也是由于兼容性原因,undefined是一些旧浏览器的覆盖变量。新的浏览器不允许这样的行动。
答案 1 :(得分:1)
您不是在寻找类或对象。看看你的描述,我想你想要一个像模块的东西。
您可以隐藏全局范围内的变量并“导出”相关位,如下所示:
var MyModule = (function(){
// regular code here
var hidden = 10,
visible = 20;
function doSomething() {
return hidden + visible;
}
// the "export" part
return {
twenty: visible,
doSomething: doSomething
};
})();
// then:
MyModule.doSomething(); // => 30
MyModule.twenty + 1 // => 21
MyModule.hidden // undefined - no such thing here
// hidden, visible and doSomething without MyModule. are invisible here
这是在JS中模拟模块的一个例子。
(function(){...})()
部分称为IIFE。
答案 2 :(得分:1)
您可以遵循不同的JavaScript设计模式来完成此任务。
我建议查看这本在线图书: http://addyosmani.com/resources/essentialjsdesignpatterns/book/