JavaScript函数currying对实例方法不起作用
作者:互联网
我正在通过在线阅读和编写一些简单的代码来学习JavaScript中的函数.我在网上文章中得到了以下示例
function toArray(obj) {
return Array.prototype.slice.call(obj);
}
Function.prototype.curry = function() {
if (arguments.length<1) {
return this; //nothing to curry with - return function
}
var __method = this;
var args = toArray(arguments);
return function() {
return __method.apply(this, args.concat(toArray(arguments)));
}
}
var add = function(a,b) {
return a + b;
}
var addTen = add.curry(10); //create function that returns 10 + argument
alert(addTen(20)); //alerts 30 correctly
然后我尝试在实例化函数的方法上尝试它.所以我试着跟随.但它给了我错误“无法获得未定义或空引用的属性’原型’在第二行.我知道这个错误与currying无关,但我搞砸了JS函数概念的一些基础知识.所以我哪里出错了.
function Person()
{
this.age = 15;
}
Person.ageAfter = function (years) {
return this.age + years;
}
var personObj = new Person();
var ageAfterFiveYears = personObj.ageAfter.prototype.curry(5); //**Error**
alert(ageAfterFiveYears());
解决方法:
你有两个问题:
> ageAfter函数不是实例方法 – 您已将其添加到“类”(即它有点像静态方法).它应该添加到原型中.
>当您对该函数进行curry时,会丢失对象的上下文,因此您需要重新绑定上下文
例如:
var ageAfterFiveYears = Person.prototype.ageAfter.curry(5).bind(personObj);
给你一个只能在当前实例上运行的函数,或者更好,正如@Pointy在评论中建议的那样,你应该将curried函数放回原型:
Person.prototype.ageAfterFiveYears = Person.prototype.ageAfter.curry(5);
然后将.ageAfterFiveYears方法添加到每个Person对象.
标签:partial-application,javascript,function 来源: https://codeday.me/bug/20190725/1535109.html