在一次采访中我被要求解决
init(1).add(2).mul(3).div(4).val();
输出它应该实现此功能,我更关心如何以上述方式调用
(1 + 2)* 3/4 = 2.25
我们如何使用javascript实现它?我想到用嵌套函数创建函数,正确的方法是什么?
我做了
var gmap = function(num) {
this.x = num;
this.add = function(ad) {
this.x = this.x * ad;
return this;
}
this.del = function(de) {
this.x = this.x + de;
return this;
}
this.final = function() {
return this.x;
}
}
答案 0 :(得分:3)
您也可以使用class
风格
class Chainable{
init(num){
this.total = num;
return this;
}
add(num){
this.total += num;
return this;
}
}
像这样使用它
var c = new Chainable();
c.init(1).add(1);
答案 1 :(得分:0)
如果您不想使用类的实例,则可以使用闭包:
function init(start) {
// this is the starting value that will get updated with each function call
let value = start;
// This is the object to be returned, notice that seach return the object instance
let self = {
add: num => {
value += num;
return self;
},
sub: num => {
value -= num;
return self;
},
mul: num => {
value *= num;
return self;
},
div: num => {
value /= num;
return self;
},
val: () => {
return value;
}
};
return self;
}
init(1).add(2).mul(3).div(4).val(); // 2.25
基本上,每次调用init函数时,都会创建一个新的闭合作用域。在此范围内,创建并只能在该范围内访问的任何局部变量的新实例。
调用init函数时,将创建两个新的变量实例value
和self
,这些实例只能由init函数中创建的其他“事物”访问。
对于每个函数,我们将返回包含函数集的变量,该变量集是函数链接调用的方式。
答案 2 :(得分:0)
您可以使用builder pattern(ES6)做这样的事情:
function init(value) {
this.result = value;
return {
add: function(addValue) {
this.result = this.result + addValue;
return this;
},
mul: function(mulValue) {
this.result = this.result * mulValue;
return this;
},
div: function(divValue) {
this.result = this.result / divValue
return this;
},
val: function() {
return this.result;
},
result: this.result,
};
}
init(1).add(2).mul(3).div(4).result