0

У меня есть модуль, написанный структурированным с шаблоном раскрывающего модуля. Это содержит подмодуль, который работает как перегрузка. Несколько функций основного модуля имеют параметры, которые не должны использоваться с usercode - только через подмодуль. Как я могу получить доступ к параметрам из подмодуля, но сделать их недоступными для «внешнего пользовательского кода»? Должен ли я сделать еще один слой для этого?JS Выявление модуля: Парамы, которые не должны использоваться пользовательским кодом

var someNamespace = someNamespace || {}; 

someNamespace.someModule = (function() { 

    // _customSiteUrl, _customToken shouldn't be available via usercode 
    function create(listName, data, _customSiteUrl, _customToken) { 
     ... 
    } 
    var XS = (function() { 
     return { 
      createXS: function (siteUrl, listName, data) { 
       ... 
       create(listName, data, siteUrl, token); 
      } 
     } 
    })(); 

    return { 
     create: create, 
     XS: XS, 
     ... 
    } 
})(); 

someNamespace.someModule.create("hi", {}, "https://...", "someHash"); //Should not be possible!! 
someNamespace.someModule.create("hi", {}); //Should be used 

ответ

1

Вы можете добавить еще один «слой» в свой .someModule с объявлением любых недоступных пользователем переменных и изменить свойство create: вашего возврата на этот уровень вместо базовой функции.

Вы должны помнить, что вы можете создать столько «перегрузок», сколько хотите, но все они сохранят те же параметры, которые вы заявляете в «перегрузке», которую вы возвращаете. То, что вы передаете внутри этой перегрузки базовой функции (create), полностью зависит от вас и полностью закрыто.

someNamespace.someModule = (function() { 

    // _customSiteUrl, _customToken shouldn't be available via usercode 
    function create(listName, data, _customSiteUrl, _customToken) { 
     ... 
    } 

    function userAccessibleCreate() { 
     return create(parameters, you, want); 
    }; 
    var XS = (function() { 
     return { 
      createXS: function (siteUrl, listName, data) { 
       ... 
       create(listName, data, siteUrl, token); 
      } 
     } 
    })(); 

    return { 
     create: userAccessibleCreate, 
     XS: XS, 
     ... 
    } 
})(); 

Теперь, пользователь может делать только действия someNamespace.someModule.create("hi", {});.

1

Я не уверен, если я правильно понимаю, но если вы хотите, чтобы удалить параметры _customSiteUrl и т.д. из общественной облицовки создать функцию, вы можете использовать что-то вроде:

return { 
    create: function(listName, data) { 
     return create(listName, data, _customSiteUrl, _customToken); 
    }, 
    XS: XS, 
    ... 
}; 

Это предполагает, что _customSiteUrl и _customToken определены в рамках подмодуля. В основном вы просто используете публичный API для вызова частного API с дополнительными параметрами.

Вы можете использовать функцию curry или частичного приложения для этого, но я оставлю это до вас.

+0

Ну, вы не поняли, что я имел в виду. См. Ответ Кроуза. Спасибо за ваше время. – sandrooco

+0

Это по сути то же самое, что и по-разному. Crowes также должен добавить публичные параметры (параметры, вы, хотите) к функции 'userAccessibleCreate', поскольку, как написано, он не принимает никаких именованных параметров без использования объектов arguments. – Shilly