let obj = {value: 0}
// 方式一:直接给对象属性添加方法
obj.add = function (a) {
this.value += a
return this
}
obj.reduce = function (b) {
this.value -= b
return this
}
// 方式二: 给对象的构造函数的原型添加方法
obj.constructor.prototype.add = function (a) {
this.value += a
return this
}
obj.constructor.prototype.reduce = function (b) {
this.value -= b
return this
}
// 然后可以链式调用obj的方法了
obj.add(3).reduce(1)
// 俩者的区别在于:前者是自有属性,后者的方法继承于原型链上
function FuncTest(num) {
this.value = num || 0
}
FuncTest.prototype.add = function (a) {
this.value += a
return this
}
FuncTest.prototype.reduce = function (b) {
this.value -= b
return this
}
let obj = new FuncTest()
obj.add(4).reduce(2)
// 第一步:针对add(2),很容易实现
function add (num) {
cal = num || 0
return cal
}
// 第二步:就变成cal(4)(6)
// 这里就会发现要想能继续执行,所以返回值cal应该是个方法
function add (num) {
cal = num || 0
func = function (i) {}
return func
}
// 第三步: 就变成func(6), 所以func的返回值也是一个方法
// 而且这里可以想到应该是返回了自己
function add (num) {
cal = num || 0
func = function (i) {
return func
}
return func
}
// 第四步: 我们需要的是返回一个确定值,而不是一个方法
// 所以,可以采用valueOf操作cal值,最后return cal给 func
function add (num) {
cal = num || 0
func = function (i) {
cal += i
return func
}
func.valueOf = function () {
return cal
}
return func
}
// 运行
add(2)(4)(6)