2016-11-13 2 views
5

Ich versuche die Methode apply zu verwenden, um die objectify-Funktion aufzurufen, ein Array von Werten zu übergeben und obj zu verwenden das Objekt. this wird jedoch nicht auf das Objekt gesetzt, sondern auf die globale Umgebung (window).JavaScript - mit "apply" zum Aufrufen der Funktion, aber "this" wird nicht auf das als erstes Argument übergebene Objekt gesetzt

Der Zweck davon ist, ein Array von Zeichenfolgen zu erhalten, und dann diese Zeichenfolgen an die Funktion objectify übergeben. Wenn die Funktion aufgerufen wird, nimmt sie die Array-Werte, teilt sie auf, und wenn das Objekt keine Eigenschaft mit dem String-Wert hat, wird diese Eigenschaft erstellt. Hier

ist der Code unter:

let obj = {}; 
let arr = ["user.name.firstname=John", "user.name.lastname=Smith"]; 

const objectify = x => { 
let cur = this, v; 
return x.split('.').forEach(e => /=/g.test(e) ? 
(v = e.split('='), cur[v[0]] = v[1]) : cur[e] ? 
cur = cur[e] : (cur[e] = {}, cur = cur[e]))}; 

objectify.apply(obj,arr); 

Das Problem wird this wird als Window eher als das Objekt obj. Wie sollte ich diesen Code so umschreiben, dass er obj als this Wert setzt?

Das Ergebnis Ende sollte ein modifiziertes obj Objekt sein, so wird es:

obj = {user: {name: {firstname: 'John', lastname: 'Smith'}}}; 
+1

was ein bizarrer naher Grund - mit '=>' anstelle einer normalen Funktion ist kaum ein Tippfehler - es ist nicht einmal ein Syntax- "Fehler" (da der Code legal ist, aber nicht so funktioniert, wie das OP erwartet es zu). – Alnitak

+0

Wie ist diese Frage off-topic? Die entsprechenden Tags wurden verwendet, eine doppelte Frage zu SO war nicht verfügbar, es gab keine Tippfehler und das Problem konnte reproduziert werden. Es hilft auch zukünftigen Lesern, da die meisten online zur Verfügung stehenden Informationen, die 'Function.prototype.apply' erklären, im Allgemeinen rudimentäre Beispiele anstelle von komplexeren verwenden. –

+0

Genau genommen ist das mehr eine Frage des Pfeilfunktionsverhaltens als das Verhalten von 'Function.prototype.apply' an sich – Alnitak

Antwort

2

Dieses (kein Wortspiel beabsichtigt) geschieht, weil objectify eine „Pfeil-Funktion“, die immer die this verwendet, die es von der erbt lexikalischen Umfang, und ignoriert alle über .apply oder .call übergebenen.

Wenn Sie es als normale Funktion umschreiben, sollte es wie gewünscht funktionieren.

+0

Das hat den Trick gemacht, aber jetzt stoße ich auf ein anderes Problem, bei dem nur der erste Array-Wert übergeben wird, und alle nachfolgenden Werte werden ignoriert. –

+0

@DocGunThrip Ja, Sie durchlaufen nicht die Parameterliste, die als einzelne Argumente übergeben werden, wenn Sie '.apply (obj, array)' verwenden. Da Sie ES6 benutzen, sollten Sie ein "Spread" '...' Argument und ein '.forEach' über das resultierende Array – Alnitak

+0

@DocGunthrop verwenden, d. H.' Function objectify (... x) ' – Alnitak

Verwandte Themen