mtichy
mtichy

Reputation: 29

JavaScript - object "this"

I have two JavaScript objects.

After adding item in Obj1 and running the method isAdded() from Obj2 there is a problem.

obj1.func stores a function, that holds the keyword this for Obj2. If I call Obj1.func([args]) this is now for Obj1 instead of Obj2.

Any answer Please?

var Obj1=function(){};
Obj1.func=null;
Obj1.addItem=function(vstup){
    //    code for add - AJAX async ....

    //    after adding
    Obj1.func(id, nazev);
};

//    ----------------------------

var Obj2=function(){
    this.variable=null;
    this.promenna2=null;

    this.isAdded=function(){
        this.variable="added";
        alert("ok");
    };
};

//    ---------------------
//    in body

window.onload=function(){
    var instanceObj2=new Obj2();
    obj1.func=instanceObj2.isAdded();
    obj1.addItem("test");
}

Upvotes: 0

Views: 86

Answers (2)

DoXicK
DoXicK

Reputation: 4812

You are doing obj1.func = instanceObj2.isAdded() which means: setobj1.functo the result ofinstanceObj2.isAdded(), which is: obj1.func = undefined since obj2.isAdded() returns nothing.

if you then execute obj1.isAdded(), which runs Obj1.func, you are essentially executing undefined as a function.

To fix it:

obj1.func = function() { instanceObj2.isAdded(); };

Calling something within another context (aka: running something and setting "this")

To run something with a different this value:

To set the context of a function, you can use either apply or call

function add()
{
    var result = this;
    for(var i = 0, l = arguments.length; i < l; i++)
        result += arguments[i];
    return result;
}
var value = 2;
newValue = add.apply(value, [3,4,5]); // = 2 + 3 + 4 + 5;
// newValue = 5
newValue = add.call(value, 3, 4, 5) // same as add.apply, except apply takes an array.

Creating a new function, with a context

In new browsers (ie9+) it's possible to use Function.prototype.bind to create a callback with a set context (this) and set arguments which precede other arguments.

callback = func.bind(object);
callback = function() { func.apply(object, arguments); }

callback = func.bind(object, 1, 2);
callback = function() { func.apply(object, [1, 2]); };

Upvotes: 3

Confused
Confused

Reputation: 1662

In javascript this refers to currently being used element, So it's reference keep changing Best method is to store (this) in a variable. and use it where you want that.

Like

var obj1This=this;
var obj2This=this;

And later use them

obj2This.isAdded();

Upvotes: 0

Related Questions