我刚开始使用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
}
})();
我将以两种不同的方式调用该函数。
但问题是如果我return this;
函数convert
怎么可能#1}?如果我没有从this
函数方法返回convert
,那么链接就无法实现。
Q :此模式中的convert()
函数应该能够执行转换并返回值,如果没有请求链接并且应该能够执行链接吗?
如果格式功能错误,请忽略。
答案 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)