【问题标题】:Javascript namespacing and OO organizationJavascript命名空间和OO组织
【发布时间】:2015-07-22 04:56:46
【问题描述】:

我的 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# 中) 现在,我被要求提供命名空间以避免函数冲突问题。问题是我不确定如何在给出我当前的代码并知道我需要保持代码面向对象的情况下实现这一点。 因此,我想知道是否有一种方法可以有效地添加一些命名空间。任何建议都可以,只要它符合添加命名空间的思路。

【问题讨论】:

标签: javascript oop namespaces code-organization


【解决方案1】:

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

【讨论】:

  • 谢谢你的答案。关于 OO 代码的第二部分很有趣。你能举一个更好的例子吗?例如,我看不到在 someObj: function() {???} 中放入什么以及如何调用它?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    只需将你的函数放入一个对象中:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 2012-05-16
      • 2010-09-12
      相关资源
      最近更新 更多