Ci sono alcune cose che sono impossibili da fare in JS senza una funzione simile a eval ( eval
, Function
, e forse più).
Prendi apply
per esempio. È facile da usare quando lo si utilizza su normali chiamate di funzione:
foo.apply(null, [a, b, c])
Ma come faresti questo per gli oggetti che stai creando tramite la nuova sintassi?
new Foo.apply(null, [a, b, c])
non funziona, né forma simile.
Ma puoi aggirare questa limitazione tramite eval
o Function
(io uso Function
in questo esempio):
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);
};
}) ();
Esempio:
Foo.New.apply(null, [a, b, c])
;
Ovviamente, potresti costruire manualmente le funzioni che Function.prototype.New
usa, ma non solo è verboso e goffo, ma (per definizione) deve essere finito. Function
consente al codice di funzionare per qualsiasi numero di argomenti.