Reputation: 29
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
Reputation: 4812
You are doing obj1.func = instanceObj2.isAdded()
which means: set
obj1.func
to the result of
instanceObj2.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
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