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
dlaczego spadać i wyłączyć temat? – madox2
To interesujące pytanie. Nie mogę się doczekać odpowiedzi @ Oriola. – N3dst4
Cytując [MDN] (https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/apply), "mniej gadatliwy i łatwiejszy do zrozumienia". –