2016-01-10 11 views
17

jestem po prostu zastanawiasz się, czy jest jakiś dobry powód, aby zadzwonić:Czy można wywołać funkcję Reflect.apply() nad Function.prototype.apply() w ECMAScript 2015?

Reflect.apply(myFunction, myObject, args); 

zamiast:

myFunction.apply(myObject, args); 
+2

dlaczego spadać i wyłączyć temat? – madox2

+0

To interesujące pytanie. Nie mogę się doczekać odpowiedzi @ Oriola. – N3dst4

+2

Cytując [MDN] (https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/apply), "mniej gadatliwy i łatwiejszy do zrozumienia". –

Odpowiedz

8

Możesz porównać definicję Function.prototype.apply i Reflect.apply w spec.

Zasadniczo są one równoważne, ale istnieje różnica: jeśli lista argumentów jest null lub undefined, Function.prototype.apply będzie wywołać funkcję bez argumentów, a Reflect.apply rzuci.

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 

Inną różnicą jest to, że podczas korzystania z func.apply, można zakładać

  • func jest instancją Function, czyli dziedziczy Function.prototype
  • func ma apply własność, która cień Function.prototype.apply

Ale Reflect.apply tego nie wymaga. Na przykład,

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

Druga różnica może być łatwo pokonana przez 'Function.prototype.apply.call' –

+1

@BenjaminGruenbaum Ale to dłużej. I zakłada, że ​​żaden zwariowany skrypt nie zatrzymał 'Function.prototype.apply' od dziedziczenia z' Function.prototype' ani nie dodał niestandardowej metody 'call' own. – Oriol

+5

Jeśli nadpisujesz 'Function.prototype.apply' w swoim własnym kodzie, niech Bóg zmiłuje twoją duszę. –

4

Patrz także SO pytanie What does the Reflect object do in JavaScript?, który zawiera ten tekst w górnym odpowiedź:

Teraz, gdy mamy moduły, moduł „@reflect” jest bardziej naturalne miejsce dla wielu metod refleksji zdefiniowanych wcześniej w Object. Ze względu na kompatybilność wsteczną jest mało prawdopodobne, że statyczne metody na Object znikną. Jednak nowe metody powinny prawdopodobnie być dodana do modułu „@reflect” zamiast do konstruktora obiektu

mi się, że w poprzednich iteracjach JS, narzędzia związane z „odbicia” zostały rozrzucone wokół języka, jako część prototypu Prototyp obiektu i jego funkcji. Obiekt Reflect to próba przeniesienia ich pod jeden dach.

Tak więc, w przypadku pytania, mimo że istnieją różnice (patrz odpowiedź Oriola), powodem ich istnienia jest ogólny ruch do przyszłościowego narzędzia do refleksji w specyfikacji ES.

0

Jednym z zastosowań mogę myśleć korzysta Reflect.apply w managment przepływu lub innych funkcji, które wykonują szereg funkcji

function execFuncs(funcArr){ 
var obj = this.someObj; 
funcArr.forEach(function(func){ 
    Reflect.apply(func,obj) 
}); 
} 

który dużo bardziej wygodnym następnie

function execFuncs(funcArray){ 
    var obj = this.someObj; 
    funcArray.forEach(function(func){ 
     func.prototype.apply(obj) 
    }) 
} 

ponieważ masz więcej kontrola.

Powiązane problemy