2017-01-19 4 views
2

Ich habe ein Objekt, das ich als Argument in eine Funktion übergebe. Innerhalb dieser Funktion möchte ich ihr einen anderen Wert zuweisen, aber da innerhalb der Funktion nur auf das ursprüngliche Objekt Bezug genommen wird, können wir keine einfache Zuweisung mit = verwenden.Zu Objekt übergeben, das als Argument in ES5 übergeben wird

In ES2015 konnte ich Object.assign

Gibt es eine Abhilfe verwende ich in ES5, andere als das Kopieren Eigenschaften auf die Referenz verwenden könnte?

Hier ist ein Beispiel https://jsbin.com/wimuvaqosi/1/edit?js,console

var x = {prop:1}; 

function foo(x1) { 
    var y = {prop:2}; 
    x1 = y; //this obviously does not work 
    //x1 = Object.assign(x1, y); //this works only in ES2015 
} 

foo(x); 

console.log("x ", x); 
+0

In Ihrem Beispiel: x1.prop = 2; Sie können jedes Objekt so ändern, dass es einem anderen gleicht. Es ist nicht nötig, einen neu zu erstellen –

+2

'Object.assign' weist keinem anderen Objekt' x' zu. Es kopiert alle Eigenschaften von "y" nach "x". @ baaos Antwort ahmt 'Object.assign' genau nach. – James

Antwort

7

Gibt es eine Abhilfe, die ich in ES5, andere als das Kopieren Eigenschaften auf die Referenz verwenden könnte?

Nicht wirklich, Object.assign kopiert auch nur Eigenschaften. Aber Sie können einfach die polyfill verwenden und Object.assign() in der Pre es2015 Code:

if (typeof Object.assign != 'function') { 
    Object.assign = function(target) { 
    'use strict'; 
    if (target == null) { 
     throw new TypeError('Cannot convert undefined or null to object'); 
    } 

    target = Object(target); 
    for (var index = 1; index < arguments.length; index++) { 
     var source = arguments[index]; 
     if (source != null) { 
     for (var key in source) { 
      if (Object.prototype.hasOwnProperty.call(source, key)) { 
      target[key] = source[key]; 
      } 
     } 
     } 
    } 
    return target; 
    }; 
} 
+1

Es ist nicht so, dass nur das Polyfill Eigenschaften kopiert, das ist genau das, was 'Object.assign' tut. – Bergi

+1

Bearbeitet die Antwort entsprechend, absolut richtig .. @Bergi – baao

1

Es sieht aus wie Sie versuchen, völlig x auf ein anderes Objekt zu ändern. Wenn dem so ist, können Sie das glücklicherweise nicht tun. Sogar Object.assign(x, y) kopiert nur Eigenschaften von x zu y gerade wie @ baaos polfill. x verweist immer noch auf das gleiche Objekt. Aber man kann:

var x = {prop:1}; 
function foo(x1) { 
    var y = {prop:2}; 
    return y; 
} 
x = foo(x); 
console.log("x ", x); 

Oder

var x = {prop:1}; 
function foo(ref) { 
    var y = {prop:2}; 
    ref.x = y; 
} 
var refX = {x: x}; 
foo(refX); 
console.log("x ", refX.x); 

IMO diese Lösungen sind besser als das, was Sie suchen, weil der Anrufer sehen kann, dass variable x zeigt nun auf ein anderes Objekt - und dies könnte wichtig. Zum Beispiel in der Javascript Sprache kann der Anrufer immer machen Annahme wie:

y = x; 
foo(x); 
y === x; // always true 

ich Verweise auf x von Lookup-Tabellen und andere Strukturen haben könnte, und diese würden nicht ersetzt bekommen - es könnte sehr verwirrend. In anderen Sprachen, wie C#, können Sie Objekt durch Verweis übergeben, aber es gibt eine andere Signatur wie foo(ref x);, so dass Sie leicht sehen können, dass x ersetzt werden kann, wenn Sie den Code lesen.

+0

Es tut mir leid, was Sie vorschlagen, sind Umgehungslösungen, keine Lösungen – Sebas

+0

Es gibt keine Lösung, so ein Workaround ist eine hilfreiche Antwort. – James

+0

warum zum Glück? Ich finde die Weitergabe der Referenz anstelle der Übergabe des Objekts selbst sehr verwirrend –

Verwandte Themen