2017-01-19 2 views
2

함수에 인수로 전달하는 객체가 있습니다. 이 함수 안에서는 다른 값을 할당하려고하지만, 원래의 객체에 대한 참조 만 가지고 있기 때문에 =를 사용하여 간단한 대입을 사용할 수 없기 때문입니다. ES2015에서ES5에서 인수로 전달 된 객체에 할당

I는 기준에 속성을 복사하는 것보다 다른 내가 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을 변경하려고하는 것처럼. 그렇다면 고맙게도 그렇게 할 수 없습니다. 심지어 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에 대한 참조를 가질 수 있고,이 교체되지 것 - 그것은 매우 혼란 얻을 수 : 자바 스크립트 언어 예를 들어, 호출자는 항상 가정 등 할 수 있습니다. 다른 언어에서는 C#과 같이 객체를 참조로 전달할 수 있지만 foo(ref x);과 같은 다른 호출 서명이 있으므로 코드를 읽을 때 x가 대체 될 수 있음을 쉽게 알 수 있습니다.

+0

죄송합니다. 해결 방법은 해결책이 아니라 해결책이 아닙니다. – Sebas

+0

해결책이 없으므로 유용한 해결책이 될 수 있습니다. – James

+0

감사하게도? 나는 객체 자체를 매우 혼란스럽게하는 대신 참조 전달을 찾는다. –

관련 문제