我有一个函数,看起来像这样:
var tempFun = function() {
return 'something';
}
tempFun.priority = 100;
现在我将它推送到一个数组中,并在这个过程中将另一个对象绑定到它:
var funArray = [];
var newObj = {};
funArray.push( tempFun.bind(newObj) );
在这之后,我想访问函数的属性,如下所示:
funArray[0].priority
但它返回undefined。在将新对象绑定到函数时,是否有某种方法可以保留函数的属性?
没有,但您可以自己编写一个函数来完成这项工作;
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; }
});
来自MDN:
bind()方法创建一个新函数,当调用该函数时该关键字设置为提供的值,具有给定的在调用新函数时提供的任何参数之前的参数。
因此,.bind()
对您想要实现的目标没有用处。除了使用jQuery映射器或重写代码以使用.prototype
之外,我能想到的解决方案是:
var obj = {};
for (var i in tempFun) {
if (tempFun.hasOwnProperty(i)) obj[i] = tempFun[i];
}