2017-08-26 42 views
0

我剛剛開始使用javascript中的方法鏈接概念。我知道鏈接方法返回this,但我在這裏使用揭示模塊模式。如果沒有方法鏈接,則Javascript返回值

代碼

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;這是預期

但問題是,如果我return this;convert功能如何將#1是可能的嗎?如果我不從convert返回this函數方法鏈接將不可能。

Qconvert()在這種模式下的函數應該能夠執行轉換並返回值,如果沒有請求鏈接並且應該能夠執行鏈接?

如果格式函數錯誤,請忽略。

+0

這種模式不適合鏈接 –

+0

,我曾經聽到的唯一一個做這樣的事情是'lodash'鏈,它使用包裝來鏈接一些方法。 – MinusFour

+0

你不需要「揭示模塊模式」。 ES6有實際的模塊。使用它們。關於鏈接,鏈式時尚已經結束。沒有人這樣做。它基本上與jQuery一起消亡。 – 2017-08-26 05:05:42

回答

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)

+0

+1感謝您的片段。看起來不錯但對原型方法不感興趣。如果我沒有得到任何其他答案,我會標記答案 –

+0

結帳替代方法的更新答案 –