链式自定义 javascript 函数

DaJ*_*aJF 8 javascript chaining

找了好久,还是没有找到我想要的。

有相当多的示例要么需要创建一个新实例,要么只有不返回任何内容的函数(这意味着可以通过返回来解决问题this)。

我希望下面的例子很好地说明了我的观点:

// Say I have these functions
function aNumber(){
    var max = 100, min = 0;
    return (Math.floor(Math.random() * (max - min + 1)) + min);
}
function divideBy(_number, _divider){
    return (_number / _divider);
}
function multiplyBy(_number, _multi){
    return (_number * _multi);
}
function add(_number, _add){
    return (_number + _add);
}
function subtract(_number, _sub){
    return (_number - _sub);
}

// #########################################################

// I can do this with them
var test = aNumber();
test = divideBy(aNumber, 2);
test = add(aNumber, 5);
test = multiplyBy(aNumber, 3);
test = subtract(aNumber, 10);

// I would like to do this however:
var test = aNumber().divideBy(2).add(5).multiplyBy(3).subtract(10);
Run Code Online (Sandbox Code Playgroud)

使最后一行工作的最有效方法是什么?

我是否误以为这是可能的,而无需创建某个新实例?

Pra*_*man 6

是的,这需要改变PrototypeObject。对象是实例。所以你需要创建一个对象来做这种事情。

function MyNum(value) {
  this._val = value;      // Having _variable is for denoting it is a private variable.
}
Run Code Online (Sandbox Code Playgroud)

使用以下方法初始化对象:

var myNum = new MyNum(5);
Run Code Online (Sandbox Code Playgroud)

现在使用这个,定义这些:

MyNum.prototype.divideBy = function () {}
MyNum.prototype.multiplyBy = function () {}
Run Code Online (Sandbox Code Playgroud)

不要忘记return this;在这些函数中使用。