JavaScript函数curry在实例方法上不起作用
通过在线阅读和编写一些简单的代码,我正在学习JavaScript中的函数转换。我在在线文章中得到了以下例子JavaScript函数curry在实例方法上不起作用,javascript,function,partial-application,Javascript,Function,Partial Application,通过在线阅读和编写一些简单的代码,我正在学习JavaScript中的函数转换。我在在线文章中得到了以下例子 function toArray(obj) { return Array.prototype.slice.call(obj); } Function.prototype.curry = function() { if (arguments.length<1) { return this; //nothi
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
您不应在通话中包含原型:
var ageAfterFiveYears = personObj.ageAfter.curry(5);
“ageAfter”属性的值有一个函数,因此该函数可以访问“curry”函数,就像第一个示例中的函数一样
在原型上调用时,函数中的this
值将是原型对象,而不是“ageAfter”函数
还有一条评论指出,您需要在原型上添加“ageAfter”:
Person.prototype.ageAfter = function(years) { ... }
Person.prototype.ageAfterFiveYears = Person.prototype.ageAfter.curry(5);
编辑-Alnitak指出的绑定问题也很重要。(当我说“重要”时,我的意思是“使代码正常工作所必需的”。您有两个问题:
ageAfter
函数不是一个实例方法-您已将其添加到“类”(即,它有点像一个静态方法)。应将其添加到原型中Person.prototype.ageAfter = function(years) { ... }
Person.prototype.ageAfterFiveYears = Person.prototype.ageAfter.curry(5);
然后将
.ageAfterFiveYears
方法添加到每个Person
对象。Curry不适用于您的用例。您需要绑定上下文,以便这是您的personObj
function Person() {
this.age = 15;
}
Person.prototype.ageAfter = function (years) {
return this.age + years;
}
var personObj = new Person();
var ageAfterFiveYears = personObj.ageAfter.bind(personObj, 5);
alert(ageAfterFiveYears());
personObj
没有属性ageAfter
。只有个人
拥有。我想你的意思是将ageAfter
分配给Person.prototype.ageAfter
,这样每个Person
实例都会继承该函数。@FelixKling我认为这是一个转录错误,但你可能是对的,这是直接的问题。@Pointy:这是我猜想的问题之一。上面提到的错误消息“无法获取未定义或空引用的属性“prototype”支持这一点。这是我提到的问题之一。我只想指出,这不是正确的curry;这是部分应用程序。请参阅:或者,调用“curry”的结果可以添加为实例或“Person”的属性“prototype,然后通过实例调用,就像调用“ageAfter”一样。注意,虽然这是可行的,但可能对OP没有用处,因为它实际上没有使用他的。curry
函数。是的,我知道这个bind()方法也是函数curry,我早些时候尝试过这个方法,效果不错,但我只是想探索其他方法ways@Mahesha999如果不解决绑定问题,这仍然是不完整的。