Ich frage mich, ob es ein guter Grund zu nennen ist:Gibt es einen Vorteil, Reflect.apply() über Function.prototype.apply() in ECMAScript 2015 aufzurufen?
Reflect.apply(myFunction, myObject, args);
statt:
myFunction.apply(myObject, args);
Ich frage mich, ob es ein guter Grund zu nennen ist:Gibt es einen Vorteil, Reflect.apply() über Function.prototype.apply() in ECMAScript 2015 aufzurufen?
Reflect.apply(myFunction, myObject, args);
statt:
myFunction.apply(myObject, args);
können Sie die Definition von Function.prototype.apply
und Reflect.apply
in der Spezifikation vergleichen.
Grundsätzlich sind sie gleichwertig, aber es gibt einen Unterschied: Wenn die Argumente Liste null
oder undefined
ist, Function.prototype.apply
wird die Funktion ohne Argumente aufrufen, und Reflect.apply
werfen wird.
function func() {
return arguments.length;
}
func.apply(void 0, null); // 0
Reflect.apply(func, void 0, null); // TypeError: null is not a non-null object
Ein weiterer Unterschied besteht darin, dass, wenn Sie func.apply
verwenden, können Sie davon ausgehen,
func
eine Function
Instanz ist, dh es ist von Function.prototype
func
erbt hat keine apply
eigene Eigenschaft, die Function.prototype.apply
Aber Reflect.apply
erfordert das nicht. Zum Beispiel
var obj = document.createElement('object');
typeof obj; // "function" -- can be called
obj.apply; // undefined -- does not inherit from Function.prototype
Reflect.apply(obj, thisArg, argList); // -- works properly
var func = a => a;
func.apply = a => 0;
func.apply(void 0, [123]); // 0 -- Function.prototype.apply is shadowed by an own property
Reflect.apply(func, void 0, [123]); // 123 -- works properly
Der zweite Unterschied kann leicht überwunden werden durch 'Function.prototype.apply.call' –
@BenjaminGruenbaum Aber das ist länger. Und geht davon aus, dass kein verrücktes Skript 'Function.prototype.apply' daran gehindert hat, von' Function.prototype' zu erben, noch eine benutzerdefinierte 'call'-eigene Methode hinzugefügt hat. – Oriol
Wenn Sie 'Function.prototype.apply' in Ihrem eigenen Code überschreiben, kann Gott sich Ihrer Seele erbarmen. –
Siehe auch die SO What does the Reflect object do in JavaScript? Frage, die diesen Text in der oberen Antwort enthält:
Jetzt, wo wir Module haben, ein „@reflect“ -Modul ist eine natürlicher Ort für viele der zuvor auf Objekt definierten Reflexionsverfahren. Aus Gründen der Abwärtskompatibilität ist es unwahrscheinlich, dass die statischen Methoden von Object nicht mehr angezeigt werden. Allerdings sollten neue Methoden wahrscheinlich auf das „@reflect“ Modul hinzugefügt werden, anstatt auf den Object-Konstruktor
Mein Verständnis ist, dass in früheren Iterationen von JS, Werkzeuge zu „Reflexion“ im Zusammenhang hat rund um die Sprache zerstreut worden, als Teil des Objektprototyps und des Funktionsprototyps. Das Reflect
Objekt ist ein Versuch, sie unter ein Dach zu bringen.
Also, im Falle Ihrer Frage, obwohl es Unterschiede gibt (siehe Oriols Antwort), ist der Grund für beide, ein allgemeiner Weg zu zukunftssicheren Reflexionswerkzeugen in der ES-Spezifikation zu sein.
Eine Verwendung ich denken kann verwendet Reflect.apply in Flussmanagement oder in Funktionen, die eine Reihe von Funktion ausführen
function execFuncs(funcArr){
var obj = this.someObj;
funcArr.forEach(function(func){
Reflect.apply(func,obj)
});
}
die viel mehr convinient dann
function execFuncs(funcArray){
var obj = this.someObj;
funcArray.forEach(function(func){
func.prototype.apply(obj)
})
}
, da Sie mehr haben Steuerung.
Warum downvote und off topic? – madox2
Es ist eine interessante Frage. Ich freue mich auf @ Oriols Antwort. – N3dst4
Angeben von [MDN] (https: //developer.mozilla.org/de-DE/docs/Web/JavaScript/Referenz/Global_Objects/Reflektieren/anwenden), "weniger ausführlich und leichter zu verstehen". –