Can you not put each class in its own module, and simply require, by name, the one you want?
On Tue, Dec 8, 2015 at 10:19 PM, John Gardner <[email protected]> wrote: > Only at top-level. This issue actually surfaced when I realised I had no > way to indirectly access classes by name... and for some reason, neither > the global object nor the eval hack were returning anything. It worked fine > for simple variables, so I wondered if that was an intentional side-effect > of classes in ECMAScript. > > (Of course, if not, it may actually be an issue with V8's > implementation...) > On 09/12/2015 5:05 PM, "Bradley Meck" <[email protected]> wrote: > >> Are you putting hundreds of classes into a single scope? >> >> On Tue, Dec 8, 2015 at 11:56 PM, John Gardner <[email protected]> >> wrote: >> >>> Trouble is, if one has literally hundreds of classes or functions that >>> need to be matched, they'd rather not pool them all into one massive object >>> literal for the sake of easier mapping. DRY principle fully relevant. >>> >>> Also, yes, while it would be a pain for static type analysis, it >>> wouldn't necessarily be the same as `eval`. Eval executes arbitrary code, >>> whereas the indirect references would only point to modifiers only: >>> >>> var className = \"doSomethingSinister(/etc/passwd/);" >>> >>> That line would literally be looking for a property in the current scope >>> that'd be named this: >>> >>> global["doSomethingSinister(/etc/passwd/);"] >>> window["doSomethingSinister(/etc/passwd/);"] >>> >>> >>> >>> On 9 December 2015 at 16:09, Frankie Bagnardi <[email protected]> >>> wrote: >>> >>>> This is a common situation, but one easily solved by object literals. >>>> Reflecting on the scope is confusing and would hurt tooling (it's >>>> essentially eval). >>>> >>>> ```js >>>> var mapping = {Polygon: Polygon}; >>>> var meshClass = mapping[ajaxData.className]; >>>> ``` >>>> >>>> >>>> >>>> >>>> On Tue, Dec 8, 2015 at 9:53 PM, John Gardner <[email protected]> >>>> wrote: >>>> >>>>> ECMAScript currently offers no clean way to "dereference" a variable >>>>> in the current scope. For instance, assume an author wishes to obtain a >>>>> reference to a class using a variable that holds its name: >>>>> >>>>> class Paintbrush{ } >>>>> >>>>> let className = "Paintbrush"; >>>>> >>>>> // Would only work in browsers, not NodeJS >>>>> console.log( window[className] ); >>>>> >>>>> // Doesn't even work in NodeJS >>>>> console.log( global[className] || this[className] ); >>>>> >>>>> A hacky workaround is to create an anonymous function that simply >>>>> returns a reference to the named variable: >>>>> >>>>> function dereference(name){ >>>>> return new Function([], "return " + name)(); >>>>> } >>>>> dereference("Paintbrush") === Paintbrush; // true >>>>> >>>>> This isn't an elegant solution, nor a preferable one. Another approach >>>>> might be to leverage `eval`, which opens up the obvious issues of >>>>> performance and security. >>>>> >>>>> Having a way of indirectly referencing another variable would fix this: >>>>> >>>>> class Paintbrush{ } >>>>> >>>>> let className = "Paintbrush"; >>>>> >>>>> let classReference = \className; >>>>> console.log(classReference === Paintbrush); // true >>>>> >>>>> Sticking a backslash before a bareword identifier creates a reference >>>>> to an object whose name matches the identifier's string value. If no such >>>>> object exists in the current scope, it simply returns `undefined`. >>>>> >>>>> I can't see this being used in everyday programs, but it would >>>>> facilitate Ajax programming considerably, where classes or functions can >>>>> only be specified by name: >>>>> >>>>> {"className":"Polygon", "vertices": [[0,0]...] } >>>>> >>>>> let meshClass = \ajaxData.className; >>>>> if(meshClass instanceof Mesh){ >>>>> new meshClass(ajaxData.vertices); >>>>> } >>>>> >>>>> >>>>> >>>>> >>>>> _______________________________________________ >>>>> es-discuss mailing list >>>>> [email protected] >>>>> https://mail.mozilla.org/listinfo/es-discuss >>>>> >>>>> >>>> >>> >>> _______________________________________________ >>> es-discuss mailing list >>> [email protected] >>> https://mail.mozilla.org/listinfo/es-discuss >>> >>> >> > _______________________________________________ > es-discuss mailing list > [email protected] > https://mail.mozilla.org/listinfo/es-discuss > >
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

