Seems there was a little error introduced by a new line.must be:var myObject =
function(){ this.foo = 'bar'; var me = this; // this is the object we
return return { func : function { return me.foo } }}
--- Timo Michna <[email protected]> schrieb am Fr, 12.3.2010:
Von: Timo Michna <[email protected]>
Betreff: AW: [APE Project] [JS server side] 'this' in Ape events and commands
callback functions.
An: [email protected]
Datum: Freitag, 12. März, 2010 12:21 Uhr
Hi!
My problem is that in callback functions (onApeAddUser, onMyCommand),
the variable 'this' is not a reference to the instance of MyClass
(namely, 'myInstance'), but rather on the [object global].
1/ Is it the expected behavior for APE (If so, why ?) or a javascript
'standard behavior' (not the same as Java or C++ for example) ?
Yes it is (for JS). In Fact it depends on how and with which scope
the appropriate callback functions are called. If they were called like
this: myInstance.onApeAddUser.call(myInstance, params,
infos);or myInstance.onApeAddUser.apply(myInstance, [params, infos]);they´d be
scoped to the myInstance object and this in
the functionswould point to it (myInstance).
2/ Is there any convenient way to make 'this' points to the instance
holding the callback function ?
Or by default, any way to be able to pass the callback a reference to
the instance of MyClass ?Well first there is to say that what you use is the
Mootools/Prototype way ofcreating pseudo classes. There are actually no things
like classes in JSsince it´s an object based language (not oriented). So there
are no classesbut only objects. (functions are also objects) So I show you one
(there are more) way to solve your problem. To understandscoping etc. In
JavaScript there are (for example) a lot of good talks on
YUiTheatre:http://developer.yahoo.com/yui/theater/Especially the ones of
Douglas Crockford are the ones to look for ("Advanced JavaScript").
A function in JS is actually a function and the "this" in it points to the
global object(in browsers this is the "window"
object). Now when you call a function with the "new" operator it becomes some
kind of a constructor an "this" points to the resulting object:
var myObject = function (){ this.foo = 'bar';}
var myInst = new myObject();myInst.foo == 'bar' // true
Now you can introduce a
'method' for the object
var myObject = function(){ this.foo = 'bar'; this.func = function(){
return this.foo; }}
var myInst = new myObject();myInst.func() == 'bar' // true
This works, but however it still depends on how the method is called.(You
could still call it with a different scope)To be absolutely sure to point to
the myInst object, you can do the following(which indeed looks a little bit
odd):
var myObject = function(){ this.foo = 'bar'; var me = this; // this is
the object we
return return { func : function { return me.foo } }}
var myInst = new myObject();myInst.func() == 'bar' // allways true
Actually you could put in this example foo in a scopedvariable like var foo =
'bar' to call it directly, but it´s
justfor the example. Also this is the way to implement "private" properties
ormethods in JS.
Hope this helps a little.(If you want to know how to do this in
Mootools/Prototype style,please, look in their documentations)
Timo
--- nouknouk <[email protected]> schrieb am Do, 11.3.2010:
Von: nouknouk <[email protected]>
Betreff: [APE Project] [JS server side] 'this' in Ape events and commands
callback functions.
An: "APE Project" <[email protected]>
Datum: Donnerstag, 11. März, 2010 16:00 Uhr
Hi,
I wanted to refactor some of my code in a nice Javascript 'class'.
The class has to register itself during initialization for
several APE
events and commands
Sample class code:
var MyClass = new Class({
Implements: [Options],
options: {
blablabla: 0
},
initialize: function(options) {
this.setOptions(options);
Ape.addEvent('adduser', this.onApeAddUser);
Ape.registerCmd("my_command", true, this.onMyCommand);
},
onApeAddUser: function(params, infos) { Ape.log("onApeAddUser;
"+this.options.blablabla); },
onMyCommand: function(params, infos) { Ape.log("onMyCommand:
"+this.options.blablabla); }
}
An instance of MyClass is created in 'global' scope like that:
var myInstance = new MyClass, { blablabla: 27 });
My problem is that in callback functions (onApeAddUser, onMyCommand),
the
variable 'this' is not a reference to the instance of MyClass
(namely, 'myInstance'), but rather on the [object global].
1/ Is it the expected behavior for APE (If so, why ?) or a javascript
'standard behavior' (not the same as Java or C++ for example) ?
2/ Is there any convenient way to make 'this' points to the instance
holding the callback function ?
Or by default, any way to be able to pass the callback a reference to
the instance of MyClass ?
3/ I also noticed the same kind of behavior for several classes which
always return a reference on the Ape object that fired the event, not
the holder of the callback function (like callbacks of 'Ape.Mysql' and
'Ape.sockClient').
Thanks in advance.
Nouk²
--
You received this message because you are subscribed to the Google
Groups "APE Project" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/ape-project?hl=en
---
APE Project (Ajax Push Engine)
Official website : http://www.ape-project.org/
Git Hub : http://github.com/APE-Project/
__________________________________________________
Do You Yahoo!?
Sie sind Spam leid? Yahoo! Mail verfügt über einen herausragenden Schutz gegen
Massenmails.
http://mail.yahoo.com
__________________________________________________
Do You Yahoo!?
Sie sind Spam leid? Yahoo! Mail verfügt über einen herausragenden Schutz gegen
Massenmails.
http://mail.yahoo.com
--
You received this message because you are subscribed to the Google
Groups "APE Project" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/ape-project?hl=en
---
APE Project (Ajax Push Engine)
Official website : http://www.ape-project.org/
Git Hub : http://github.com/APE-Project/