2017-01-19 11 views
2

私は関数に引数として渡すオブジェクトを持っています。その関数の中で私は別の値を代入したいのですが、関数の内部では元のオブジェクトへの参照しか持たないので、=で単純な代入を使うことはできません。 ES2015ではES5で引数として渡されたオブジェクトへの割り当て

私が参照にプロパティをコピーする以外に、私はES5に使用できる回避策は、ありObject.assign

使用することができますか?ここで

は例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

例:x1.prop = 2;すべてのオブジェクトを別のオブジェクトに変更することができます。 –

+2

'Object.assign'は' x'を別のオブジェクトに割り当てません。 'y'のすべてのプロパティを' x'にコピーします。 @ baaoの答えは正確に 'Object.assign'と似ています。 – James

答えて

7

ある参照にプロパティをコピーする以外に、私はES5に使用できる回避策は、ありますか?

実際、Object.assignはプロパティをコピーするだけではありません。しかし、あなたは単にあなたの前es2015コードで()polyfillを使用してObject.assignを使用することができます。

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

Polyfillはプロパティをコピーするだけではなく、 'Object.assign'と同じです。 – Bergi

+1

それに応じて、正しく編集されました。@Bergi – baao

1

に見えますが、完全に異なるオブジェクトにxを変更しようとしているよう。もしそうなら、ありがたいことに、それをすることはできません。 Even Object.assign(x, y)でも@ baaoのpolfillのようにxからyまでのプロパティがコピーされます。 xはまだ同じオブジェクトを参照しています。しかし、次のことができます - これは問題かもしれない

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

それとも

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これらのソリューションを使用すると、呼び出し側がx変数は今別のオブジェクトを指していることを見ることができるので、探しているものよりも優れています。

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

私は、ルックアップテーブルやその他の構造からxへの参照を持つことができ、これらは交換されませんでした - それは非常に混乱し得ることができる:JavaScript言語の例では、発信者は、常に前提のようなことがあります。他の言語では、C#のように参照でオブジェクトを渡すことができますが、foo(ref x);のような別の呼び出し署名がありますので、コードを読むときにxが置き換えられることが容易にわかります。

+0

申し訳ありませんが、あなたが提案したものは解決策ではなく、解決策ではありません。 – Sebas

+0

解決策はありません。 – James

+0

ありがたいことに?私は非常に混乱してオブジェクト自体を渡す代わりに参照渡しを見つける –

関連する問題