Never mind. This is beginning to south like too much of a damn edge case for it to be of language-wide relevance.
Pretend this discussion never happened. On 09/12/2015 5:40 PM, "Jordan Harband" <[email protected]> wrote: > 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

