起因是在群里有人问了一道题:
实现如下功能:var a = add(2)(3)(4); // 9
在计算机科学中,柯里化(英语:Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
上述问题的一种实现方式如下:
|
|
那么为什么需要复写toString
和valueOf
呢?
在权威指南中是这样解释两种方法的:
toString()
方法的作用是返回一个可以表示这个对象的字符串。在希望使用字符串的地方用到对象的话,JavaScript会自动调用这个方法,如果没实现这个方法,类会默认从Object.prototype
中继承toString()
方法,这个方法的结果是[object object]
。valueOf()
用来将对象转换为原始值。比如,当数学运算符(除了“+”运算符)和关系运算符作用域数字文本表示的对象时,会自动调用valueOf()
方法。
未定义的toString
或valueOf
方法,返回的是tem声明的函数,而我们需要把对象转换成原始类型的值(数值、字符串和布尔值),因此需要重写两个方法使它返回需要的值。