假设我有这样的东西:
const fn = function(a){
return function(b){
return a + b;
}
}
但是想象一下,我们想向 return 函数添加一个属性,所以我们这样做:
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');
}
这样的东西存在吗?也许我应该用第一种方式来做。
你的问题很有用。我从你的问题中学到的是,你可以制作一个可以作为函数工作的对象。 一个遗漏的东西是Function.prototype.addProp
,应该是Object.prototype.addProp
。
并定义Function
函数,将function
转换为Object
。这将返回您想要的内容。
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
的情况下解决问题的基本方法,但也许有更好的方法可以使用完全不同的模式来做到这一点。