Требуется объяснение кода генерации вложенного пространства имён JavaScript - PullRequest
1 голос
/ 13 июня 2011

Может кто-нибудь объяснить, как это работает ниже?

var MYAPP = {};
MYAPP.namespace = function(name){
    var parts = name.split('.');
    var current = MYAPP;
    for (var i in parts) {
        if (!current[parts[i]]) {
            current[parts[i]] = {};
        }
        // shouldn't this line override the MYAPP object with all it's properties?
        current = current[parts[i]];
    }
}

Ответы [ 4 ]

2 голосов
/ 13 июня 2011

current сначала присваивается ссылка на MYAPP, после чего в цикле для каждой части массива из name.split впоследствии присваивается ссылка на только что созданное свойствоMYAPP.Так что ничего не перезаписывается, потому что все это ссылки .

в словах, например, если вы выполните MYAPP.namespace(foo.bar), это происходит:

  • first: current pointsна MYAPP
  • Теперь перейдите в цикл.Если current /*is ref to MYAPP*/ .foo не существует, создайте MYAPP.foo
  • и позвольте current указать на MYAPP.foo
  • , если current /*is now ref to MYAPP.foo*/ .bar не существует, создать его
  • наконец, MYAPP содержит:
    • MYAPP.foo
    • MYAPP.foo.bar
  • Если вы хотите присвоить то же самое MYAPP как MYAPP.namespace(foo.bar) используя литерал объекта, вы написали бы
    • var MYAPP = { foo: { bar: {} }
0 голосов
/ 13 июня 2011

Метод namespace позволяет создавать вложенные объекты в объекте MYAPP.

Если вы вызываете MYAPP.namespace('foo.bar'), он:

  • проверит, существует ли MYAPP.fooи создайте его, если его нет.
  • проверьте, существует ли MYAPP.foo.bar, и создайте его, если его нет.
0 голосов
/ 13 июня 2011

Я объясню это с примером кода. Посмотрите этот код var MYAPP = {} создает глобальный пустой объект, если оставить как сейчас. MYAPP.namespace является методом экземпляра для объекта и может использоваться как MYAPP.namespace("foo.bar")

позволяет быстро просмотреть, когда я делаю это MYAPP.namespace("ice.cream") он создает два внутренних объекта, проверяя предыдущее существование, например MYAPP.ice.Cream, которые действуют индивидуально И да, эта строка переопределяет наш исходный объект MYAPP, удаляет эту строку или абстрагирует метод пространства имен от глобальных утилит. что-то вроде Utils.registerNameSpace("MYAPP.Ice.Cream");

0 голосов
/ 13 июня 2011

Все это действительно инициализирует пустые объекты.

При вызове MYAPP.namespace('foo.bar') он создаст пустой объект ({}) в MYAPP.foo, а затем снова один в MYAPP.foo.bar. Таким образом, вы можете добавить функции и переменные в MYAPP.foo.bar.

...