编程语言
首页 > 编程语言> > JavaScript函数currying对实例方法不起作用

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