Сведения о вопросе

HEIGTH

15:49, 10th August, 2020

Теги

Есть ли "concise" способ сделать пространство имен в JavaScript?

Просмотров: 489   Ответов: 6

Я часто сталкивался с сайтами, которые помещали все свои JavaScript внутри структуры namespace вдоль линий:

namespaces = { com : { example: { example.com's data} }

Однако безопасная настройка этого по отношению к другим пространствам имен, по-видимому, требует относительно большого количества кода (определенного как > 2 строки). Мне было интересно, знает ли кто-нибудь краткий способ сделать это? Кроме того, есть ли относительно стандартный/последовательный способ структурировать его? Например, присоединяется ли пространство имен com непосредственно к глобальному объекту или оно присоединяется через объект пространства имен?

[Edit: упс, очевидно, {com = { ... } } не достигнет ничего близкого к тому, что я намеревался, благодаря Shog9 за указание на это.]



  Сведения об ответе

fo_I_K

14:58, 16th August, 2020

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

Вот ваш пример, исправленный:

var namespaces = { com: { example: { /* example.com's data */ } } }

Это переменная namespaces , которой присваивается объектный литерал. Объект содержит одно свойство: com, объект с одним свойством: example, объект, который предположительно будет содержать что-то интересное.

Итак, вы можете ввести что-то вроде namespaces.com.example. somePropertyOrFunctionOnExample


  Сведения об ответе

screen

05:27, 27th August, 2020

Вот интересная статья Питера Мишо о Javascript пространствах имен . Он обсуждает 3 различных типа пространства имен Javascript:

  1. Префикс Пространства Имен
  2. Пространство Имен Одного Объекта
  3. Пространство Имен Вложенных Объектов

Я не буду плагиировать то, что он сказал Здесь, но я думаю, что его статья очень информативна.

Питер даже зашел так далеко, что указал на то, что с некоторыми из них есть соображения производительности. Я думаю, что эту тему было бы интересно обсудить, учитывая, что новые планы ECMAScript Harmony отказались от планов 4.0 по пространству имен и упаковке.


  Сведения об ответе

KOMP

12:39, 3rd August, 2020

Я стараюсь следовать соглашению Yahoo о создании одного родительского объекта в глобальной области, чтобы содержать все;

var FP = {};
FP.module = {};
FP.module.property = 'foo';


  Сведения об ответе

DAAA

06:39, 25th August, 2020

Чтобы убедиться, что вы не перезаписываете существующий объект, вы должны сделать что-то вроде:

if(!window.NameSpace) {
    NameSpace = {};
}

или

var NameSpace = window.NameSpace || {};

Таким образом, вы можете поместить это в верхней части каждого файла в вашем приложении / веб-сайте, не беспокоясь о перезаписи объекта пространства имен. Кроме того, это позволит вам писать модульные тесты для каждого файла в отдельности.


  Сведения об ответе

crush

15:05, 6th August, 2020

Библиотека YUI library имеет код, который обрабатывает пространство имен с помощью функции, которую вы можете найти предпочтительной. Это могут делать и другие библиотеки.


  Сведения об ответе

#hash

05:35, 5th August, 2020

В качестве альтернативы точке или подчеркиванию можно использовать символ знака доллара:

var namespaces$com$example = "data"; 


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться