acrmuui
acrmuui

Reputation: 2070

Preserve function property when created with "bind"

I have a function that looks like this:

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

Now I'm pushing it to an array and binding another object to it in the process like this:

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

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

and after this, I would like to acces the function's property like this:

funArray[0].priority

but it returns undefined. Is there some way to preserve the property on the function while binding a new object to it?

Upvotes: 3

Views: 89

Answers (3)

Saturnix
Saturnix

Reputation: 10564

From MDN:

The bind() method creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.

Hence, .bind() won't be useful for what you're trying to achieve. Besides using jQuery mappers or rewriting your code to use .prototype, a solution that I can think of is:

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

Upvotes: 1

Tibos
Tibos

Reputation: 27823

No. Bind returns a new function, which "wraps" around the original one. All you can do is copy the properties on this new function:

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

funArray.push( boundFun );

If you want the properties to be in sync (changes in one visible on the other) you can do:

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

Upvotes: 1

Matt
Matt

Reputation: 75317

No, but you could write a function to do this yourself;

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

... which you could then use via;

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

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

Upvotes: 2

Related Questions