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



假设我有这样的东西:

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的情况下解决问题的基本方法,但也许有更好的方法可以使用完全不同的模式来做到这一点。

最新更新