Javascript部分应用程序

时间:2014-06-28 09:47:56

标签: javascript prototype

我试图用currying来扩展Function原型但是我得到了意想不到的结果。在某些情况下它可以正常工作,但不是全部。

这是使用augument原型的代码:

Function.prototype.method = function(name, func) {
  if(!this.prototype[name]){ 
    this.prototype[name] = func;
  }
  return this;
};

Function.method("curry-left", function(){
  var slice = Array.prototype.slice; 
  var that = this;
  var args = slice.call(arguments,0);
  return function(){
    that.apply(null, args.concat(slice.call(arguments,0)));
  }
});

我用以下代码测试它:

function print(arg1, arg2){
  console.log(arg1 + ", " + arg2);
}

print["curry-left"]("hej")("då"); // prints hej, då

var op = {"+":function(a,b){return a + b;}}

console.log(op["+"]["curry-left"](1)(2)) // prints undefined

我已经尝试过调试它,它似乎是原型中的that变量弄乱了一切,但我不知道为什么。如果我console.log(that)我得到了[Function],这似乎是正确的

如果我可以让它在两个实例上工作,那将是很好的。

提前致谢

1 个答案:

答案 0 :(得分:1)

问题是你的内部函数没有返回结果:

Function.method("curry-left", function(){
  var slice = Array.prototype.slice; 
  var that = this;
  var args = slice.call(arguments,0);
  return function(){
    that.apply(null, args.concat(slice.call(arguments,0)));
    ^
  }
});

修复:

return that.apply(null, args.concat(slice.call(arguments,0)));