使用“bind”创建时保留函数属性

时间:2013-11-27 16:17:46

标签: javascript function bind

我有一个看起来像这样的函数:

var tempFun = function() {
    return 'something';
}
tempFun.priority = 100;

现在我将它推送到一个数组并在此过程中将另一个对象绑定到它:

var funArray = [];
var newObj = {};

funArray.push( tempFun.bind(newObj) );

之后,我想像这样访问函数的属性:

funArray[0].priority

但它返回undefined。有没有办法在将新对象绑定到函数时保留函数的属性?

3 个答案:

答案 0 :(得分:2)

不,但你可以自己编写一个函数来执行此操作;

Function.prototype.bindAndCopy = function () {
    var ret = this.bind.apply(this, arguments);

    for (var x in this) {
        if (this.hasOwnProperty(x)) {
            ret[x] = this[x];
        }
    }

    return ret;
}; 

...然后你可以通过;

var funArray = [];
var newObj = {};

funArray.push( tempFun.bindAndCopy(newObj) ); 

答案 1 :(得分:1)

没有。绑定返回一个新函数,它“包裹”原始函数。您所能做的就是复制这个新功能的属性:

var boundFun = tempFun.bind(newObj)
boundFun.priority = tempFun.priority;

funArray.push( boundFun );

如果您希望属性同步(另一个属性可见,则可以执行以下操作):

Object.defineProperty(boundFun, 'priority', {
  get : function () { return tempFun.priority; },
  set : function (val) { tempFun.priority = val; }
});

答案 2 :(得分:1)

来自MDN

  

bind()方法创建一个新函数,当被调用时,它具有它   此关键字设置为提供的值,具有给定的序列   调用新函数时提供的任何参数。

因此,.bind()对您要实现的目标没有用处。除了使用jQuery映射器或重写代码以使用.prototype之外,我能想到的解决方案是:

var obj = {};
for (var i in tempFun) {
    if (tempFun.hasOwnProperty(i)) obj[i] = tempFun[i];
}