如果没有可用的方法链接,Javascript返回值

时间:2017-08-26 03:28:12

标签: javascript method-chaining revealing-module-pattern

我刚开始使用javascript中的方法链接概念。我知道将this返回到链方法,但我在这里使用了揭示模块模式。

代码

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

我将以两种不同的方式调用该函数。

  1. currency.convert(100); // 6410;现在它返回率,这是 预期
  2. currency.convert(1000).format(); // 64100;这是预期的
  3. 但问题是如果我return this;函数convert怎么可能#1}?如果我没有从this函数方法返回convert,那么链接就无法实现。

    Q :此模式中的convert()函数应该能够执行转换并返回值,如果没有请求链接并且应该能够执行链接吗?

    如果格式功能错误,请忽略。

1 个答案:

答案 0 :(得分:1)

如评论中所述,您在OP中显示的模式不适合链接。但是你想要达到的目标绝对没问题。查看嵌入式脚本以了解如何完成此操作



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())




注意:上面的代码段不是100%完美,但只是为了了解如何在javascript中实现这一点。

更新 - 1
根据评论,这是另一种方法:



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)