Hay algunas cosas que son imposibles de hacer en JS sin una función similar a eval ( eval
, Function
y quizás más).
Tomar apply
por ejemplo. Es fácil de usar cuando se usa en llamadas a funciones comunes:
foo.apply(null, [a, b, c])
¿Pero cómo haría esto para los objetos que está creando a través de una nueva sintaxis?
new Foo.apply(null, [a, b, c])
no funciona, ni tampoco formularios similares.
Pero puede evitar esta limitación a través de eval
o Function
(yo uso Function
en este ejemplo):
Function.prototype.New = (function () {
var fs = [];
return function () {
var f = fs[arguments.length];
if (f) {
return f.apply(this, arguments);
}
var argStrs = [];
for (var i = 0; i < arguments.length; ++i) {
argStrs.push("a[" + i + "]");
}
f = new Function("var a=arguments;return new this(" + argStrs.join() + ");");
if (arguments.length < 100) {
fs[arguments.length] = f;
}
return f.apply(this, arguments);
};
}) ();
Ejemplo:
Foo.New.apply(null, [a, b, c])
;
Por supuesto, usted podría construir manualmente las funciones que utiliza Function.prototype.New
, pero no solo es detallado, sino que (por definición) tiene que ser finito. Function
permite que el código funcione para cualquier número de argumentos.