2013-06-15 2 views
0

Я пытаюсь создать библиотеку foo.js с функцией foo.bar в нем, что я могу назвать, как так:Создания пространств имен для библиотеки JavaScript

<script src="foo.js"></script> 
<script> 
    baz = foo.bar(); 
</script> 

Я пытаюсь написать эту библиотеку так:

foo = function() { 
    foo.bar = function() { 
     // code goes here 
    } 
}(); 

, который является образцом, который я видел, используется в других местах, хотя я не могу сказать, что я точно понимаю, что происходит. Когда я пытаюсь использовать это, мне говорят, что foo не определяется, когда я пытаюсь определить foo.bar. Что мне не хватает?

ответ

3

Существует так много возможных узоров, что невозможно быть уверенным в том, что вы хотели.

Вы можете сделать это, например:

var foo = (function(foo) { 
    // here you can also declare "private" non exported variables, 
    // including functions that could be used by bar 
    foo.bar = function() { 
     // code goes here 
    } 
    return foo; 
})(foo||{}); 

Это обеспечит foo существует и будет добавить bar функцию foo. Если foo не существует раньше, он создается. Если он существует раньше, он просто дополняется.

Та же логика может быть использована для создания подмодулей, тогда это имеет смысл.

+0

foo и foo, это запутанный мир! – Codebeat

+0

+1, мне нравится этот узор. Тогда есть прототипирование, литералы и еще сто других, чтобы выбрать из того, что делает почти то же самое. Для простых вещей я всегда использую объектный литерал, поскольку я думаю, что его легче понять и отслеживать, но я думаю, что это всего лишь вопрос мнения. – adeneo

+1

вам нужно вернуть свой внутренний foo! – hereandnow78

2

Или вы могли бы сделать это:

var foo = { 
      bar : function() { 
       // code goes here 
      } 
}; 

но это литерал объекта, но все-таки можно назвать с foo.bar()

3

прочитать эту книгу для JS-моделей:

http://addyosmani.com/resources/essentialjsdesignpatterns/book/

его бесплатно, и его отлично!

вдохновлен dystroys ответ я бы изменить его немного и записать его как этот

var foo = (function() { 

    // your private stuff here 

    return { 
    bar: function() {} 
    }; 

})(); 
+0

+1 для ссылки addyosmani, это действительно хорошее чтение. – Teemu

1

Я хотел бы написать мои JavaScript модули сегодня, как это:

(function(exports){ 

    exports.greet = function(){ 
     return 'hello beloved world' 
    }; 

})(typeof exports === 'undefined'? this['uebermodule']={}: exports); 

Таким образом, вы можете использовать свою библиотеку в браузере, а также в node.js

uebermodule.greet() // is uniform in node as in browser 

Dr. Axel Rauschmayer написал на эта тема.

Смежные вопросы