2016-01-10 2 views
17

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); 
+2

Warum downvote und off topic? – madox2

+0

Es ist eine interessante Frage. Ich freue mich auf @ Oriols Antwort. – N3dst4

+2

Angeben von [MDN] (https: //developer.mozilla.org/de-DE/docs/Web/JavaScript/Referenz/Global_Objects/Reflektieren/anwenden), "weniger ausführlich und leichter zu verstehen". –

Antwort

8

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
  • Schatten würde

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 
+3

Der zweite Unterschied kann leicht überwunden werden durch 'Function.prototype.apply.call' –

+1

@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

+5

Wenn Sie 'Function.prototype.apply' in Ihrem eigenen Code überschreiben, kann Gott sich Ihrer Seele erbarmen. –

4

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.

0

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.

Verwandte Themen