Un javascript modèle de conception pour les options avec les valeurs par défaut?
//opt_options is optional
function foo(a, b, opt_options) {
//opt_c, opt_d, and opt_e are read from 'opt_options', only c and d have defaults
var opt_c = 'default_for_c';
var opt_d = 'default_for_d';
var opt_e; //e has no default
if (opt_options) {
opt_c = opt_options.c || opt_c;
opt_d = opt_options.d || opt_d;
opt_e = opt_options.e;
}
}
Ci-dessus semble terriblement bavard. Ce qui est une meilleure façon de gérer argument options avec les paramètres par défaut?
- jQuery et soulignent à la fois venir avec un étendre la méthode qui gère cela très bien.
- ainsi, l'utilisation de
extend
et de ne pas conserver des variables locales pour les options? - En fait, après un certain temps, j'en ai conclu que le fait d'être détaillé est une bonne chose quand il s'agit de Javascript arguments nommés. La copie de chaque argument d'une variable au début de la fonction est une bonne façon de documenter quelles sont les options et vous permet aussi de les modifier sans vissage avec l'objet original.
- J'ai tendance à être d'accord, mais je n'aime pas chaque variable apparaissant deux fois. Découvrez ma solution ci-dessous.
Vous devez vous connecter pour publier un commentaire.
Il utilise jQuery.étendre mais pourrait être échangé avec un objet de la fusion à partir de votre bibliothèque de choix ou de l'Objet.attribuer dans l'ES6.
Modifier: Maintenant aussi dans
soulignement
oulodash
!En Javascript ES6 vous pouvez utiliser Objet.attribuer:
defaults.color
, vous voulez l'option réelle.'color'
encolor
- je pense que c'est plus idiomatique js, non?Il ya un couple de nouveaux moyens dans l'ES6/ES2015. À l'aide de
Object.assign
:À l'aide de déstructuration affectation:
Vous pouvez également utiliser la déstructuration des paramètres de fonction:
Pas de dépendances!
options
est pas défini!Pour obtenir les options par défaut sans dépendances supplémentaires, j'utilise le schéma suivant:
Bien qu'un peu verbeux, je le trouve facile à lire, ajouter/supprimer des options et ajouter des valeurs par défaut. Lorsqu'il y a BEAUCOUP d'options, un peu plus compact version:
Et le plus compact de la version jQuery:
Si vous avez besoin de faire cela dans de nombreux consécutives fonctions, une façon de normaliser les processus et la vitesse est de:
Ensuite, il vous suffit de définir vos fonctions simplement comme ceci:
De cette façon, vous ne définissez l'une des options de l'objet à l'intérieur de la fonction, qui contient les valeurs par défaut.
Si vous souhaitez mettre un supplément de vérifier à éviter l'héritage de prototype, la première fonction peut être:
Le dernier cas n'est pas pris en charge pour: IE < 9, Chrome < 5, Firefox < 4, Safari < 5
(vous pouvez consulter le tableau de compatibilité des ici)
Enfin ECMAScript 6 va nous apporter la meilleure façon de le faire: paramètres par défaut.
Il faudra quelques mois avant que cela est largement pris en charge dans les navigateurs.
Bien que Objet.attribuer est assez simple de manière à fusionner les options des réglages par défaut, il a quelques inconvénients:
si vous souhaitez définir conditionnelles options avec l'opérateur ternaire - il va remplacer les valeurs par défaut, même pour les
undefined
valeurs:si vous fournissez un nom d'option pas - vous ne serez pas averti:
Pour couvrir ces cas, j'ai créé minuscule plat-options paquet.
Il permet de ne pas écraser les valeurs par défaut pour
undefined
valeurs:et met en garde pour l'option incorrecte noms:
Espérons que cette aide!
Si vous avez accès à ES6 avec du stade 4 de la proposition (comme avec Babel) vous pouvez accomplir cela avec la diffusion et la déstructuration de l'affectation.
JS:
Cela fonctionne aussi (mais peut créer des objets):
(dernier exemple de David Walsh - @wprl la réponse mentionne également ce)
Je pense que vous êtes à la recherche de quelque chose comme ceci (désolé pour la réponse tardive):
edit: toutes mes excuses, saisi cette de certains vieux code... Vous devriez assurez-vous d'utiliser la méthode hasOwnProperty() pour vous assurer de ne pas répéter sur tout sur la fonction.prototype
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
"undefined"
au lieu de vraiment pas défini (vous avez probablement laissé de côté untypeof
, maisoptions[i] !== undefined
c'est bien aussi si vous êtes prêt à supposer que certains bozo n'a pas redéfinirundefined
).Maintenant que j'y pense, j'aime bien ceci:
opt_a
etopt_b
complètement m'a jeté 🙂var opt_c = opt_options.c || 'default_for_c';
Ne semble pas commeopt_options.c
ne serait jamais atteint depuis'default_for_c'
évaluera comme truthy.var opt_c = opt_options.c != null ? opt_options.c : 'default_for_c';