2015-02-22 10 views
5

In der MDN page forObject.assign() umschließt das Beispiel Polyfill zuerst alle Quellen und die Zielparameter in Object(), bevor Sie über die Eigenschaften iterieren. (d.h. Object(target), Object(source1), Object(source2) ...).Was ist der Zweck von `Object (target)` in `Object.assign()` polyfill

Der Text erwähnt auch, dass die zusätzlichen Eigenschaften direkt zum Ziel hinzugefügt werden, bevor das Ziel zurückgegeben wird. Durch das Umbrechen des Ziels in Object() wird jedoch ein Objekt erstellt, das sich von der einfachen Erweiterung der Eigenschaften unterscheidet. (d. h. Object(target).newProp !== target.newProp).

Alle angegebenen Beispiele haben Objekte als Parameter zu Object.assign(). Der Anwendungsfall für Nicht-Objekt-Quell- oder Zielparameter ist daher nicht klar.

A) Welchen Zweck hat das Umschließen von Parametern in Object()? (Ich habe den Eindruck, dass Object.keys(x) ist das gleiche wie Object.keys(Object(x))).

B) Was sind mögliche Anwendungsfälle für die Verwendung von Object.assign() mit Nicht-Objekten, ist eine? (Zum Beispiel so etwas wie: Object.assign(1, 'b', [3], true, function(){}))

+2

'Objekt (Ziel)' wirft das Ziel in ein Objekt. Zum Beispiel: 'Objekt (" 1234 ")" wirft dies auf "[Objekt String] {0:" 1 ", 1:" 2 ", 2:" 3 ", 3:" 4 ", Länge: 4}' – Mouser

+5

Normalerweise ist es am besten, die Spezifikation in Verbindung mit dem Polyfill zu lesen, da sie oft versuchen, das Verhalten zu replizieren. Sie können von der [* ed. 6 Entwurf *] (https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign), dass jedes Argument an * ToObject * übergeben wird. Da natives Skript nicht auf interne Methoden zugreifen kann, ist der Aufruf von 'Object (target)' und 'Object (source)' eine Näherung (wenn auch nicht exakt die gleiche, insbesondere für * null * und * undefined *). – RobG

+0

@Mouser. Ich verstehe, was Object() tut. Was ich nicht verstehe, ist, warum Sie so etwas wie Object.assign ([], 'a', 3, function() {}) machen würden. – Hurelu

Antwort

2

Lassen Sie uns es brechen:

Testen Sie, ob das Objekt vorhanden ist, wenn es nicht machen:

if (!Object.assign) { 

Machen Sie das Verfahren über Object.defineProperty und füge es zu Object hinzu

Object.defineProperty(Object, 'assign', { 
    enumerable: false, 
    configurable: true, 
    writable: true, 

Hier wird die eigentliche Funktion eingestellt. Man muss ein Ziel und ein Quellenminimum bereitstellen.

value: function(target, firstSource) { 
     'use strict'; 

Wenn das Ziel definiert ist, keinen Fehler zu werfen.

 if (target === undefined || target === null) { 
     throw new TypeError('Cannot convert first argument to object'); 
     } 

das Ziel-Objekt-Format gegossen. (Eg String 1234 zu [object String]{0: "1", 1: "2", 2: "3", 3: "4", length: 4}.

 var to = Object(target); 

Nun Schleife durch alle Quellen die Argumente Aufgabe der Funktion. Beginne mit 1, da 0 ist das Ziel.

 for (var i = 1; i < arguments.length; i++) { 
     var nextSource = arguments[i]; //store the argument in a variable. 
     if (nextSource === undefined || nextSource === null) { 
      continue; //if the source is undefined continue. 
     } 

Dann brauchen wir alle (nicht nur die exposed) die aufzählbaren Eigenschaften aus dem Quellobjekt, verwenden Object.keys in Kombination mit Object(source).

 var keysArray = Object.keys(Object(nextSource)); 

Iterate über die Tasten:

 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) { 
      var nextKey = keysArray[nextIndex]; //select the key from the index. 

getOwnPropertyDescriptor gibt uns Informationen über die Immobilie in Form eines Objekts.

  var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); 

Wenn die Eigenschaft nicht undefiniert ist und durchläuft dann als Eigenschaft auf to diese Eigenschaft festgelegt.

  if (desc !== undefined && desc.enumerable) { 
      to[nextKey] = nextSource[nextKey]; 
      } 
     } 
     } 
     return to; 
    } 
    }); 
} 

schließlich zurück to mit den neu hinzugefügten (geklont) Eigenschaften aufweisen.

+0

Schön, aber der Grund, dass 'var to = Object (target);' gemacht wird, ist nicht so, dass "der Code über die Eigenschaften aufzählen kann", sondern wenn das Ziel kein Objekt (zB '1') war Eigenschaften nicht zuweisen. Es gibt keine Schleife über die Eigenschaften des Ziels, um diesen Anspruch zu unterstützen. –

+0

Richtig, es zählt sie nie auf. Es wird nur in ein Objekt konvertiert. – Mouser

+0

Sorry, ich verstehe es immer noch nicht. Das Bit im Polyfill, das ich nicht verstehe (daher die Frage) ist der Schritt "Ziel ins Objektformat umwandeln". Ich bekomme das gleiche Ergebnis mit 'Object.keys ('abcd')' wie in 'Object.keys (Object ('abcd'))' also vermute ich, dass das Wrapping für andere Verwendungen ist, an die ich noch nicht denken kann . – Hurelu