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

时间:2017-11-10 03:07:48

标签: javascript node.js

说我有这样的事情:

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');
    }

这样的事情存在吗?也许我应该第一时间这样做。

2 个答案:

答案 0 :(得分:1)

你的问题很有用。(我从你的问题中学到的是你可以制作一个可以作为一个函数运作的对象。)遗漏的是Function.prototype.addProp,它应该是Object.prototype.addProp。< / p>

定义将Function转换为function的{​​{1}}函数。 这将返回你想要的东西。

&#13;
&#13;
Object
&#13;
&#13;
&#13;

答案 1 :(得分:0)

所以我们可以在不修补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的情况下解决问题的基本方法,但也许有一种更好的方法可以用完全不同的模式来实现。