0

J'ai un module écrit structuré avec le motif de module révélateur. Cela contient un sous-module qui fonctionne comme une surcharge. Quelques fonctions du module principal ont des paramètres qui ne devraient pas être utilisés avec le code utilisateur - uniquement via le sous-module. Comment puis-je accéder aux paramètres du sous-module, mais les rendre indisponibles pour le "code utilisateur externe"? Dois-je faire un autre calque pour cela?JS Modèle de module révélateur: Paramètres qui ne doivent pas être utilisés par le code utilisateur

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 

Répondre

1

Vous pouvez simplement ajouter une autre « couche » dans votre .someModule avec les toutes les variables inaccessible utilisateur étant déclarées localement, et modifier la propriété create: de votre retour à cette couche, au lieu de la fonction de base. Vous devez vous rappeler, vous pouvez créer autant de "surcharges" que vous le souhaitez, mais ils conservent tous les mêmes paramètres que vous déclarez dans la "surcharge" que vous renvoyez. Ce que vous passez à l'intérieur de cette surcharge à la fonction de base (create) est entièrement à vous et entièrement privé.

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, 
     ... 
    } 
})(); 

Maintenant, l'utilisateur peut seulement faire someNamespace.someModule.create("hi", {});.

1

Je ne sais pas si je comprends bien, mais si vous voulez supprimer les paramètres _customSiteUrl etc du public face fonction de création, vous pouvez utiliser quelque chose comme:

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

Cela suppose que _customSiteUrl et _customToken sont définis dans la portée du sous-module. Vous avez essentiellement l'API publique appeler l'API privée avec les paramètres supplémentaires.

Vous pouvez également utiliser une fonction curry ou une application partielle, mais je vous laisse le soin de le faire.

+0

Eh bien, vous n'avez pas compris ce que je voulais dire. Voir la réponse des Crowes. Merci pour votre temps. – sandrooco

+0

C'est essentiellement la même chose codée différemment. Crowes doit également ajouter les paramètres publics (parameters, you, want) à la fonction 'userAccessibleCreate', car comme écrit, il n'accepte aucun paramètre nommé sans utiliser l'objet arguments. – Shilly