I have come across an interesting issue, at least I think it's interesting, and a little annoying. I have a class, for this question I will keep it extremely simple...
class Foo {
static pageChange() {
console.log('The page changed');
}
}
Now, I can access that with Foo.pageChange() no problem, everything works as expected. The hard part, and interesting bit comes in when I try to access this dynamically. I have a separate object that monitors events and handles dispatching them as needed. This pertains to the Google visualization library, where I have a table, and the table has events tied to it. I have an object that is responsible for creating all of this from PHP output. It is one heck of a system, in an easy explanation you can do something like this in PHP...
GoogleVisLibrary::renderChart(
array(
'chartType' => 'table',
'chartData' => $this->chartData,
'chartOptions' => $this-chartOptions,
'events' => array(
'sort' => 'Foo.pageChange'
)
);
now that will create teh table and all that good stuff. The problem is accessing that static method in the Foo class in javascript. What I had prior to creating the Foo as a class was this.
var Foo = {
pageChange: function() {
console.log('page changed');
}
}
then in my event library handler thingy it would look something like this..
for(var i = 0, l = events.length; i < l; i++) {
window[events.className][events.fnName].apply();
}
and that would work fine because Foo can be accessed through window['Foo'] but when you use the class definition shown in the first code snippet, you can no longer access it from the window super global, it just outputs 'undefined'.
So, is there any way to access a static method in a class, through a dynamic reference like you can with the Foo object through the window global?
I am hoping that makes sense and I am explaining it correctly. If anyhting doesn't make sense please feel free to ask, I will try to explain better. Thank you in advance for any help you can give.
To get a reference on the
window
object, you'll need to do that explicitly:Read more about classes not being properties of the
window
object in this answer, which also quotes the ECMA2015 Specification, Section 8.1.1.4: Global Environment Records:Using a dedicated object
It would be better not to use the global object for this, and dedicate a specific object to contain your classes and base your event managing library on that object, as illustrated in this simplified snippet:
I got the same problem myself for quite a while, and I finally discovered a very simple solution : using
eval
.Create your class :
Get it dynamically :
I dislike
eval
, but in this case it is as simple as fast. And it's the only way I found without adding the class towindow
.(I also tried
(new Function("return Foo;"))()
and it appearseval
is 2-3 times faster)