Возврат нескольких вызовов методов из другого метода в JavaScript, раскрывающий шаблон модуля

Я экспериментирую с раскрывающимся шаблоном модуля для текущего проекта.

У меня есть методы init в верхней части нескольких методов, где я устанавливаю переменные и вызываю методы, необходимые для правильной работы модулей, когда они вызываются соответствующими обработчиками событий.

У меня есть метод init, который сейчас выглядит так:

function init(elem) {
    var width, 
    height,  
    tipHeight, 
    tipWidth, 
    topMargin, 
    leftMargin;

    return appendTip();
};

Итак, это возвращает вызов метода appendTip.

В другом модуле настройка выглядит так:

    function init() {
        var width = 0,
        $siteNavListElem = $('.nav-SiteNav .nav-list > li'),
        $subNav = $('.subNav > li > ul');

            appendSubNav();
        getWidth();
};

Итак, теперь есть два вызова отдельных методов. Этот код работает нормально, но интересно, может ли он быть более аккуратным?

Как вернуть оба? Является ли возвращение их лучшим способом позвонить им?

Спасибо.


person RyanP13    schedule 04.04.2011    source источник


Ответы (1)


На самом деле я не уверен, что вы вообще следуете шаблону раскрытия модулей. Шаблон объясняет возврат общедоступного объекта, который содержит общедоступный интерфейс вашего объекта. Таким образом, возврат функции из функции на самом деле не представляет собой этот шаблон. Для этого шаблона вы смотрите на что-то вроде этого

 function revealingPattern = function(){
    var privateVar = 1;
    function prviateFunction(){
    //.....
    }

    function publicFunction(){
    //code
    }

    function pubFunction2()[
    //code
    }
    var publicVariable = 2;

    return{
     pubFunction1:publicFunction
    ,pubFunction2:pubFunction2
    ,pubVariable:publicVariable
    };
    }()

//use as
revealingPattern.pubFunction1();

По сути, все, что вы возвращаете из функции инкапсуляции (revealingPattern), — это анонимный объект, который содержит именованные свойства, являющиеся общедоступным интерфейсом объекта раскрытияPattern, который вам разрешено использовать.

Однако мне не нравится этот шаблон, потому что он не говорит вам, является ли свойство в возвращаемом объекте функцией или переменной!

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

person Nikhil    schedule 04.04.2011
comment
Мой справочный материал был следующим: addyosmani.com/resources/essentialjsdesignpatterns/book/ - person RyanP13; 04.04.2011
comment
Если вы прокрутите вниз до раздела «Шаблон раскрывающегося модуля». - person RyanP13; 04.04.2011
comment
Я только что прошел по ссылке. На самом деле даже там описано, что в этом паттерне главное — вернуть анонимный объект, содержащий указатели на ваши публичные функции. Это делает оператор return, который возвращает {set:setPerson,get:getPerson}. Таким образом, в основном вы возвращаете не вызов функции как return myFunction(), а анонимный объект, который содержит ссылку на функцию как return {myFun:myFunction}. Надеюсь, это немного объясняет - person Nikhil; 04.04.2011
comment
Да, я понимаю вашу точку зрения. Тогда я не уверен, как выполнять задачи «инициализации», необходимые при загрузке страницы. - person RyanP13; 04.04.2011
comment
Вам точно нужен этот узор? Я имею в виду, есть ли методы или свойства, которые вы хотите скрыть от своего скрипта? Этот шаблон позволит вам создать объект, по сути, с открытым интерфейсом, который вы можете использовать, и частным интерфейсом, который вы не можете использовать. Если это не то, что вам нужно, вы можете пропустить весь шаблон и просто делать то, что вы уже делаете во втором примере кода. В качестве альтернативы опубликуйте более подробную информацию и некоторый код, и я помогу вам :) - person Nikhil; 04.04.2011
comment
Я согласен, что шаблон может быть излишним для моих текущих целей, но меня привлекла возможность сделать мой код модульным. Мне также нравится идея конфиденциальности, поэтому я решил попробовать. Это не рабочий код, но полный модуль находится здесь: jsfiddle.net/yCMUs/1 Я действительно хотел, чтобы мой код не был связан с событиями. Итак, в моем примере это связано с событием наведения. Но его можно было бы использовать в другом месте более легко, следуя этому образцу. - person RyanP13; 04.04.2011
comment
Я также получил идею для помощников из этого сообщения: stackoverflow.com/questions/3339668/ - person RyanP13; 05.04.2011
comment
Также, когда я просматриваю этот jqfundamentals.com/book/index.html#chapter-10 похоже, что они выполняют аналогичные действия, вызывая приватные методы из других методов. - person RyanP13; 05.04.2011
comment
Я вижу, что вы пытаетесь там сделать. Надо сказать, соблазн углубиться в узор довольно силен! Однако я был бы немного обеспокоен, если бы у вас был такой оператор, как icisSite.tooltip = function(elem){...., который фактически говорит, что вы можете создать одноэлементный объект (ваш icisSite.tooltip), определив функцию и немедленно вызвав ее. (выполнив }() в конце), потому что ваша функция зависит от аргумента, который должен быть передан! Я не предлагаю вам не использовать шаблон или аккуратный синтаксис, просто вы (или мы!) должны найти подход, более подходящий для ваших нужд. - person Nikhil; 05.04.2011
comment
Я понимаю что ты имеешь ввиду. Я не знаю, как удалить зависимость от передачи элемента, который зависает в модуле. Мне нужно знать, какой из них зависает, чтобы показать правильную всплывающую подсказку. Я думаю, архитектура плагина была бы здесь более подходящей? Я знаю, что уже есть много плагинов для всплывающих подсказок, но я против загрузки ресурсов, которые нам не нужны, а также хотел добавить свои собственные :) Я считаю, что это учит меня гораздо большему, чем просто проверка чужого кода. - person RyanP13; 05.04.2011
comment
Я играю с пользовательским шаблоном. Как только я закончу, я опубликую это для вас, чтобы увидеть. Вы должны пообещать, что не будете смеяться :) - person Nikhil; 05.04.2011