JavaScript函数curry在实例方法上不起作用

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

通过在线阅读和编写一些简单的代码,我正在学习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

您不应在通话中包含原型:

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
    函数不是一个实例方法-您已将其添加到“类”(即,它有点像一个静态方法)。应将其添加到原型中

  • 在执行函数时,对象的上下文将丢失,因此需要重新绑定上下文

  • e、 g:

    给你一个只在当前实例上工作的函数,或者更好,正如@Pointy在注释中所建议的,你应该把curried函数放回原型上:

    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如果不解决绑定问题,这仍然是不完整的。