Как мне объявить пространство имен в JavaScript?

Попробуйте добавить

<context:annotation-config/>  

в ваш конфигурационный файл Spring.

956
задан George Stocker 29 August 2014 в 16:19
поделиться

9 ответов

Мне нравится это:

var yourNamespace = {

    foo: function() {
    },

    bar: function() {
    }
};

...

yourNamespace.foo();
749
ответ дан 19 December 2019 в 20:21
поделиться

Вы должны проверить Namespace.js out!

5
ответ дан 28 July 2019 в 06:24
поделиться

JavaScript doesn’t поддерживает пространство имен по умолчанию. Таким образом, при создании какого-либо элемента (функция, метод, объект, переменная) затем, это становится глобальным, и загрязните глобальное пространство имен. Давайте возьмем пример определения двух функций без любого пространства имен,

function func1() {
    console.log("This is a first definition");

}
function func1() {
    console.log("This is a second definition");
}
func1(); // This is a second definition

Это всегда называет второе функциональное определение. В этом случае пространство имен решит проблему коллизии имени.

0
ответ дан 19 December 2019 в 20:21
поделиться

Я использую такой подход:

var myNamespace = {}
myNamespace._construct = function()
{
    var staticVariable = "This is available to all functions created here"

    function MyClass()
    {
       // Depending on the class, we may build all the classes here
       this.publicMethod = function()
       {
          //Do stuff
       }
    }

    // Alternatively, we may use a prototype.
    MyClass.prototype.altPublicMethod = function()
    {
        //Do stuff
    }

    function privateStuff()
    {
    }

    function publicStuff()
    {
       // Code that may call other public and private functions
    }

    // List of things to place publically
    this.publicStuff = publicStuff
    this.MyClass = MyClass
}
myNamespace._construct()

// The following may or may not be in another file
myNamespace.subName = {}
myNamespace.subName._construct = function()
{
   // Build namespace
}
myNamespace.subName._construct()

Внешний код может быть таким:

var myClass = new myNamespace.MyClass();
var myOtherClass = new myNamepace.subName.SomeOtherClass();
myNamespace.subName.publicOtherStuff(someParameter);
32
ответ дан 19 December 2019 в 20:21
поделиться

Другой способ сделать это, который я считаю немного менее ограничивающим, чем буквальная форма объекта, заключается в следующем:

var ns = new function() {

    var internalFunction = function() {

    };

    this.publicFunction = function() {

    };
};

Вышеупомянутое во многом похоже на модуль и , нравится вам это или нет , он позволяет вам сделать все ваши функции общедоступными, избегая при этом жесткой структуры литерала объекта.

336
ответ дан 19 December 2019 в 20:21
поделиться

После переноса нескольких моих библиотек в разные проекты и необходимости постоянно менять пространство имен верхнего уровня (со статическим именем), я переключился на использование этого небольшая (с открытым исходным кодом) вспомогательная функция для определения пространств имен.

global_namespace.Define('startpad.base', function(ns) {
    var Other = ns.Import('startpad.other');
    ....
});

Описание преимуществ можно найти в моем сообщении в блоге . Вы можете скачать исходный код здесь .

Одно из преимуществ, которое мне действительно нравится, - это изоляция модулей в отношении порядка загрузки. Вы можете обратиться к внешнему модулю ДО того, как он будет загружен. И полученная вами ссылка на объект будет заполнена, когда код станет доступен.

7
ответ дан 19 December 2019 в 20:21
поделиться

Есть ли более элегантный или лаконичный способ сделать это?

Да. Например:

var your_namespace = your_namespace || {};

тогда вы можете иметь

var your_namespace = your_namespace || {};
your_namespace.Foo = {toAlert:'test'};
your_namespace.Bar = function(arg) 
{
    alert(arg);
};
with(your_namespace)
{
   Bar(Foo.toAlert);
}
156
ответ дан 19 December 2019 в 20:21
поделиться

Я создал пространство имен , вдохновленное модулями Erlang. Это очень функциональный подход, но именно так я сейчас пишу свой код JavaScript.

Он дает замыканию глобальное пространство имен и предоставляет определенный набор функций внутри этого замыкания.

(function(){

  namespace("images", previous, next);
  // ^^ This creates or finds a root object, images, and binds the two functions to it.
  // It works even though those functions are not yet defined.

  function previous(){ ... }

  function next(){ ... }

  function find(){ ... } // A private function

})();
9
ответ дан 19 December 2019 в 20:21
поделиться

Это продолжение ссылки пользователя 106826 на Namespace.js. Похоже, проект переехал на GitHub. Теперь это smith/namespacedotjs.

Я использовал этот простой помощник JavaScript для своего крошечного проекта, и пока он кажется легким, но достаточно универсальным, чтобы управлять пространством имен и загрузкой модулей/классов. Было бы здорово, если бы это позволило мне импортировать пакет в пространство имен по моему выбору, а не только в глобальное пространство имен... вздох, но это не главное.

Это позволяет вам объявить пространство имен, а затем определить объекты/модули в этом пространстве имен:

Namespace('my.awesome.package');
my.awesome.package.WildClass = {};

Другой вариант — объявить пространство имен и его содержимое одновременно:

Namespace('my.awesome.package', {
    SuperDuperClass: {
        saveTheDay: function() {
            alert('You are welcome.');
        }
    }
});

Дополнительные примеры использования см. в файле example.js. в источнике .

32
ответ дан 19 December 2019 в 20:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: