Javascript 使用“创建时保留函数属性”;绑定";

Javascript 使用“创建时保留函数属性”;绑定";,javascript,function,bind,Javascript,Function,Bind,我有一个函数如下所示: var tempFun = function() { return 'something'; } tempFun.priority = 100; var funArray = []; var newObj = {}; funArray.push( tempFun.bind(newObj) ); funArray[0].priority 现在我将它推送到一个数组,并在这个过程中将另一个对象绑定到它,如下所示: var tempFun = function()

我有一个函数如下所示:

var tempFun = function() {
    return 'something';
}
tempFun.priority = 100;
var funArray = [];
var newObj = {};

funArray.push( tempFun.bind(newObj) );
funArray[0].priority
现在我将它推送到一个数组,并在这个过程中将另一个对象绑定到它,如下所示:

var tempFun = function() {
    return 'something';
}
tempFun.priority = 100;
var funArray = [];
var newObj = {};

funArray.push( tempFun.bind(newObj) );
funArray[0].priority
在这之后,我想像这样访问函数的属性:

var tempFun = function() {
    return 'something';
}
tempFun.priority = 100;
var funArray = [];
var newObj = {};

funArray.push( tempFun.bind(newObj) );
funArray[0].priority

但它返回未定义的。在将新对象绑定到函数时,是否有办法保留该函数的属性?

否,但您可以自己编写函数来实现这一点

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

否。Bind返回一个新函数,该函数“包装”原始函数。您所能做的就是复制此新函数的属性:

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; }
});
发件人:

bind()方法创建一个新函数,该函数在调用时具有 此关键字设置为提供的值,并具有给定的 调用新函数时,将在任何函数前面提供参数

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

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

非常感谢您的回答,非常有趣的想法!非常感谢您,这看起来非常好,对于我的简单用例来说可能就足够了。