将属性添加到函数声明/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
,但也许有更好的方法来完成这个完全不同的模式。