2017-08-26 6 views
0

Je commence tout juste avec la méthode chaining concept en javascript. Je suis conscient de retourner this aux méthodes de la chaîne, mais j'utilise le modèle de module révélateur ici.Javascript renvoyant la valeur si aucun chaînage de méthode n'est disponible

code:

var currency = (function(){ 
    var rates = { 
     INR: 64.10 
    }; 

    function convert(value){ 
     return value * rates["INR"]; 
     //"return this"? and also get the return value (if no chained mathods) ? 
    } 

    function format(){ 
     return this.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,"); 
    } 

    return { 
     convert: convert, 
     format: format 
    } 
})(); 

Je vais appeler la fonction de deux manières différentes.

  1. currency.convert (100); // 6410; maintenant il renvoie le taux et c'est prévu
  2. currency.convert (1000) .format(); // 64,100; cela devrait

Mais le problème est si je return this; de la fonction convert comment serait # 1 possible? Si je ne retourne pas this de la méthode de fonction convert, le chaînage ne sera pas possible.

Q: convert() fonction dans ce modèle devrait être en mesure d'effectuer la conversion et retourner la valeur si aucune Enchaînement est demandée et devrait être en mesure d'effectuer enchaînant?

Veuillez ignorer si le format fonctionne mal.

+0

ce modèle n'est pas adapté à enchaînant –

+0

Le seul que j'ai jamais entendu de faire quelque chose comme ceci est la chaîne 'lodash', qui utilise un wrapper pour enchaîner certaines des méthodes. – MinusFour

+0

Vous n'avez pas besoin du "motif de module révélateur". ES6 a des modules réels. Utilise les. En ce qui concerne l'enchaînement, la mode de l'enchaînement est terminée. Personne ne le fait. Il est en train de mourir avec jQuery. –

Répondre

1

Comme mentionné dans les commentaires, le motif que vous avez montré dans l'OP n'est pas adapté à l'enchaînement. Mais ce que vous essayez d'accomplir est absolument parfait. Regardez à travers le script intégré pour voir comment cela peut être fait

let CurrencyConverter = (function() { 
 
    const rates = { 
 
    INR: 64.10 
 
    } 
 
    
 
    // CurrencyConverter class 
 
    function CurrencyConverter() { 
 
    // instantiate with new 
 
    // 'this' inside this function is the new instance 
 
    // of CurrencyConverter 
 
    this.value = 0; 
 
    } 
 

 
    // Add convert method 
 
    // this method just convert the value and store it 
 
    CurrencyConverter.prototype.convert = function convert(value) { 
 
    this.value = value * rates["INR"]; 
 
    return this; 
 
    } 
 

 
    // Add format method 
 
    // this method formats the rate and 
 
    // return the formatted output 
 
    CurrencyConverter.prototype.format = function format() { 
 
    return (this.value + "").replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,"); 
 
    } 
 
    
 
    // add as many more methods as you want 
 
    // ... 
 
    
 
    // finally return the 'class' 
 
    return CurrencyConverter; 
 
})() 
 

 
// instantiate new converter 
 
let converter = new CurrencyConverter(); 
 

 
// convert 
 
console.log(converter.convert(75).format())

REMARQUE: L'extrait ci-dessus n'est pas parfait à 100%, mais il est là juste pour donner une idée de la façon dont cela peut être réalisé en javascript.

MISE À JOUR - 1
Basé sur le commentaire, voici une autre approche:

let converter = (function() { 
 
    // constant rates 
 
    const rates = { 
 
    INR: 64.10, 
 
    GBP: 1.29 
 
    } 
 

 
    // converter function 
 
    return function convert(value, currency) { 
 
    let _val = (value * rates[currency || "INR"]).toFixed(2) 
 

 
    let ret = {} 
 

 
    // value getter 
 
    Object.defineProperty(ret, 'value', { 
 
     get:() => _val 
 
    }); 
 

 
    // value formatter 
 
    Object.defineProperty(ret, 'formatted', { 
 
     get:() => (_val + "").replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,") 
 
    }); 
 

 
    return ret; 
 
    } 
 
})(); 
 

 
// use it like 
 
console.log(converter(125).value) 
 
console.log(converter(120, "GBP").formatted)

+0

+1 Merci pour l'extrait. On dirait bien mais pas intéressé par l'approche prototype. Je coche la réponse si je n'obtiens pas d'autres réponses –

+0

Cochez la réponse mise à jour pour une autre approche –