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