Как я могу создать пустой объект пространства имен без перезаписи другого объекта с тем же именем? - PullRequest
1 голос
/ 24 февраля 2012

Я как можно больше изучал шаблон модуля, предложенный в блоге Yahoo YUI.

Я заметил, что YUI предлагает возможность создания нового пустого объекта пространства имен без перезаписи существующегоодноименное имя, например:

YAHOO.namespace("myProject");

, которое затем можно вызывать и использовать с YAHOO.myProject

(напоминание: если YAHOO.myProject уже существует,не перезаписывается)

Как я могу добиться подобного эффекта, используя обычный javascript и без использования YUI?

Пожалуйста, объясните как можно подробнее.

Полный текстСтатью в блоге YUI, где это делается, можно найти здесь .

Поскольку я изучаю и совершенствую свои знания и навыки по JavaScript, я пытаюсь создать свою собственную библиотеку JavaScript (даже если яникогда не нужно его использовать)

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

В вашем примере это может работать так:

if (!YAHOO.myProject) {
    YAHOO.myProject = {};
}
YAHOO.myProject.whatever = true;

или используя собственное имя родительского модуля:

var myModule = myModule || {};  // make sure parent is defined without overwriting
if (!myModule.myProject) {
    myModule.myProject = {};
}
myModule.myProject.whatever = true;

Или определите свою собственную функцию пространства имен:

function myNamespace(item) {
    if (!myModule[item]) {
        myModule[item] = {};
    }
}

myNamespace("myProject");
myNamespace.myProject.whatever = true;
1 голос
/ 24 февраля 2012

Редактировать Просто понял, что я не отвечаю прямо на ваш вопрос. Сожалею! Однако, надеюсь, это поможет вам понять некоторые альтернативные методы.

Это техника, которую я использую время от времени, например, когда я хочу добавить свойство или функцию один раз и не допустить перезаписи позже.

    var module = new function(){

        var modules = {}; //internal module cache

        return function(name, module){
            //return all modules
            if( !name ) return modules;

            //return specific module
            if( modules[name] ) return modules[name];

            //return the module and store it
            return modules[name] = module;
        }

    }

Так что вы можете использовать его так:

//will store this since it doesn't exist
module('test', 'foo'); //Since 'test' doesn't exist on the internal 'modules' variable, it sets this property with the value of 'foo'

module('test'); // Since we aren't passing a 2nd parameter, it returns the value of 'test' on the internal 'modules' variable

module('test', 'bar'); //We are attempting to change the value of 'test' to 'bar', but since 'test' already equals 'foo', it returns 'foo' instead.

module(); // { 'test': 'foo' } //Here we aren't passing any parameters, so it just returns the entire internal 'modules' variable. 

Главное, на что нужно обратить внимание, это то, что мы используем 'new function ()'. Это делается при назначении, потому что мы действительно хотим, чтобы «модуль» был внутренней функцией, а не внешней. Но чтобы создать замыкание для внутренней переменной 'var modules', внешняя функция должна выполняться при присваивании.

Также обратите внимание, что вы могли бы написать внешнюю функцию, чтобы она также выполнялась самостоятельно:

var module = function(){
    var modules = {};
    //other stuff
}();
1 голос
/ 24 февраля 2012

Q. Как я могу создать пустой объект пространства имен без перезаписи другого объекта с тем же именем?

Ты не можешь. По определению одно и то же имя не может ссылаться как на ваш новый пустой объект, так и на существующий объект.

Если вы имеете в виду «Как я могу проверить создание пустого объекта пространства имен, только если он еще не существует, в противном случае я хочу добавить к существующему», то вы просто делаете это:

if (!YAHOO.myProject)
   YAHOO.myProject = {};

// or you may see this variation:
YAHOO.myProject = YAHOO.myProject || {};

Мне не нравится последнее, но оно часто используется для достижения того же эффекта, что и простое выражение if.

Чтобы принять этот общий принцип много , далее взгляните на эту статью: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

ОБНОВЛЕНИЕ: Согласно документации YUI API для YAHOO.namespace(), метод «Возвращает указанное пространство имен и создает его, если оно не существует», которое вы примечание гораздо менее двусмысленно, чем формулировка блога, который вы читали, и в значительной степени подтверждает то, что я уже сказал ...

...