Javascript 命名空间和 OO 组织

Javascript namespacing and OO organization

我的 javascript 代码如下:

$(document).ready(function () {

    //call of global functions
    globalFunction1();
    globalFunction2(); //create a new object inside
    globalFunction3();
}

function globalFunction1() {
    // do something directly with jquery selectors
    var testObj1 = new object1($('#tree')); // this is called later in the function
    testObj.doSomething();
}


function globalFunction2() {
    // do other things
}

function globalFunction3() {
    // do something directly with jquery selectors
}

//creating an object in js
var object1 = (function () {
        var tree;

        function object1($tree) {
            tree = $tree;
        });
}
object1.prototype.doSomething = function () {
    .....
};
return fancyStructure;
})();

通常我有更多的全局函数,如果可能的话,我总是尝试使用 new 关键字创建对象(如在 Java 或 C# 中) 现在,我被要求提供命名空间以避免函数冲突问题。事情是我不确定如何实现我当前的代码并知道我需要保持代码面向对象。 因此,我想知道是否有一种方法可以有效地添加一些命名空间。只要符合添加命名空间的要求,任何建议都可以。

使用对象作为函数的容器。这是 JS 中代码结构的标准方法。

var namespace1 = {
    func1: function() {},
    func2: function() {},
}

var namespace2 = {
    func1: function() {},
    func2: function() {},
}

namespace1.func2();

您可以将您的 OOP 代码存储在这个命名空间中:

var namespace3 = {
    someObj: function() {},
    create: function() { return new this.someObj(); },
}
namespace3.someObj.prototype = { 
    count: 15,
    someFunc() {} 
}

并且您可以轻松扩展它们:

namespace3.anotherObj = function () {}

编辑

关于你的例子:

var fancyStructureWrapped = (function () {
    var tree;
    function fancyStructure($tree) {
        tree = $tree;
    });

    fancyStructure.prototype.doSomething = function () {
        .....
    };
    return fancyStructure;
})();

// add it to some namespace
someNamespace.fancyStructure = fancyStructureWrapped;

//create an instance
var fs = new someNamespace.fancyStructure();
//and use it
fs.doSomething();

只需将您的函数放入一个对象中即可:

var mynamespace = {
    globalFunction1 : function() {
        // do something directly with jquery selectors
        var testObj1 = new object1($('#tree')); // this is called later in the function
        testObj.doSomething();
    },
    globalFunction2 : function() {
        // do other things
    },
    globalFunction3 : function() {
      // do something directly with jquery selectors
    }
}

并使用

调用函数
mynamespace.globalFunction1();

或者您可以只定义您的命名空间

mynamespace = {};

然后添加函数

mynamespace.globalFunction1 = function() {
    //do something
};

如果您正在寻找管理不断增长的 JavaScript 代码库的通用方法,请查看 RequireJS and/or Browserify。两者都是允许将代码分成模块化位(即 AMD 或 CommonJS 模块)然后在它们之间 referencing/importing 的库。它们包括用于在需要部署生产构建时将这些文件捆绑到单个 JS 文件中的工具。