将属性添加到函数声明/expression式内联

说我有这样的事情:

const fn = function(a){ return function(b){ return a + b; } } 

但是然后想象我们想要添加一个属性到返回函数,所以我们这样做:

 const fn = function(a){ const ret= function(b){ return a + b; }; ret.foo = 'bar'; return ret; } 

但是如果ret是一个具有较大主体的函数,并且我们希望立即返回它,同时仍然将foo赋值给ret,所以我们尝试如下所示:

  const fn = function(a){ return function(b){ return a + b; }.foo = 'bar'; } 

当然,这不太合适。 我想我正在寻找的是Function.prototype上的一个方法,可以让我们添加一个属性,然后返回函数,如下所示:

 Function.prototype.addProp = function(prop: string, val: any){ this[prop] = val; return this; } 

然后用这样的:

  const fn = function(a){ return function(b){ return a + b; } .addProp('foo','bar'); } 

任何机构知道这样的事情是否存在? 也许我应该做的第一个办法大声笑。

你的问题是有用的(我从你的问题中学到的是你可以创build一个可以作为函数的对象)。一个错过的是Function.prototype.addProp ,它应该是Object.prototype.addProp

并定义将function转换为Object Function函数。 这将返回你想要的。

  function Function(f){ var ret = f; return ret; } Object.prototype.addProp = function(prop, val){ this[prop] = val; return this; } const fn = function(a){ return Function(function(b){ return a + b; }).addProp('foo','bar') .addProp('foo1', 'bar1'); } console.log(fn(1)(2)); console.log(fn(1).foo); console.log(fn(1).foo1); 

所以我们可以在不修补Function.prototype情况下这样做:

 const proto = Object.create(Function.prototype); proto.addProp = function(prop: string, val: any){ this[prop] = val; return this; }; const fn = function(){ }; Object.setPrototypeOf(fn, proto); 

所以现在你可以打电话

 fn.addProp('foo','bar'); console.log(fn.foo); // => 'bar' 

这些信息是解决问题的基本方法,而不需要修改Function.prototype ,但也许有更好的方法来完成这个完全不同的模式。