Javascript命名空间和OO组织

时间:2015-05-11 15:35:28

标签: javascript oop namespaces code-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#中) 现在,我被要求提供命名空间以避免功能冲突问题。事情是我不知道如何实现给出我当前的代码,并知道我需要保持代码面向对象。 因此,我想知道是否有办法有效地添加一些命名空间。只要按照添加命名空间的方式,任何建议都可以。

2 个答案:

答案 0 :(得分:2)

使用对象作为函数的容器。这是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();

答案 1 :(得分:2)

只需将您的功能放入对象:

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
};