-
객체를 매개 변수로 전달할 때 JavaScript는 객체를 참조로 전달하므로 객체의 로컬 복사본을 생성하기 어렵습니다.
var o = {}; (function(x){ var obj = x; obj.foo = 'foo'; obj.bar = 'bar'; })(o)
o
것.foo
하고.bar
. -
복제를 통해이 문제를 해결할 수 있습니다. 간단한 예 :
var o = {}; function Clone(x) { for(p in x) this[p] = (typeof(x[p]) == 'object')? new Clone(x[p]) : x[p]; } (function(x){ var obj = new Clone(x); obj.foo = 'foo'; obj.bar = 'bar'; })(o)
o
필요가 없습니다.foo
나.bar
.
질문
- 로컬 복사본 / 복제를 만드는 것 외에 값으로 개체를 전달하는 더 좋은 방법이 있습니까?
답변
별로.
당신이 실제로 필요에 따라 하나의 가능성은 세트에있을 수 있습니다 o
새로운 객체의 프로토있다.
var o = {};
(function(x){
var obj = Object.create( x );
obj.foo = 'foo';
obj.bar = 'bar';
})(o);
alert( o.foo ); // undefined
따라서 추가하는 속성 obj
은에 추가 되지 않습니다 o
. 의 속성 obj
과 동일한 속성 이름으로에 추가 된 모든 속성 은 속성을 o
섀도 잉합니다 o
.
물론에 추가 된 모든 속성 은 섀도우 처리되지 않은 경우 o
에서 사용할 수 있으며 프로토 타입 체인에있는 obj
모든 개체는 .o
o
또한 obj
Array와 같은 다른 개체를 참조하는 속성이있는 경우 개체에 구성원을 추가하기 전에 해당 개체를 그림자로 처리해야합니다. 그렇지 않으면 해당 구성원이에 추가되고 obj
모든 개체간에 공유됩니다. 이 obj
프로토 타입 체인에.
var o = {
baz: []
};
(function(x){
var obj = Object.create( x );
obj.baz.push( 'new value' );
})(o);
alert( o.baz[0] ); // 'new_value'
여기에서 당신은 당신의 배열을 그림자하지 않았기 때문에 것을 알 수 있습니다 baz
에 o
로모그래퍼 baz
에 특성 obj
의 o.baz
배열이 수정됩니다.
따라서 대신 먼저 그림자를 만들어야합니다.
var o = {
baz: []
};
(function(x){
var obj = Object.create( x );
obj.baz = [];
obj.baz.push( 'new value' );
})(o);
alert( o.baz[0] ); // undefined
답변
이 답변 https://stackoverflow.com/a/5344074/746491을 확인 하십시오 .
즉, JSON.parse(JSON.stringify(obj))
객체를 json으로 직렬화 할 수있는 경우 객체를 복사하는 빠른 방법입니다.
답변
다음은 개체의 전체 복사를 수행하는 복제 기능입니다.
function clone(obj){
if(obj == null || typeof(obj) != 'object')
return obj;
var temp = new obj.constructor();
for(var key in obj)
temp[key] = clone(obj[key]);
return temp;
}
이제 다음과 같이 사용할 수 있습니다.
(function(x){
var obj = clone(x);
obj.foo = 'foo';
obj.bar = 'bar';
})(o)
답변
사용하다 Object.assign()
예:
var a = {some: object};
var b = new Object;
Object.assign(b, a);
// b now equals a, but not by association.
동일한 작업을 수행하는 더 깨끗한 예 :
var a = {some: object};
var b = Object.assign({}, a);
// Once again, b now equals a.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
답변
JavaScript에서 객체가 작동하는 방식에 대해 약간 혼란스러워합니다. 개체의 참조 는 변수의 값입니다. 직렬화되지 않은 값이 없습니다. 객체를 생성 할 때 그 구조는 메모리에 저장되고 할당 된 변수는 해당 구조에 대한 참조를 보유합니다.
당신이 요청하는 것이 어떤 종류의 쉬운 모국어 구조로 제공 되었더라도 기술적으로는 여전히 복제가 될 것입니다.
JavaScript는 실제로 값에 의한 전달입니다. 전달 된 값이 무언가에 대한 참조 일 수 있습니다.
답변
이것을 사용하십시오
x = Object.create(x1);
x
그리고 x1
두 개의 다른 개체가 될 x
것입니다.x1
답변
Javascript는 항상 값으로 전달됩니다. 이 경우 참조 사본을 전달합니다.o
익명 함수로 합니다. 코드는 참조 사본을 사용하고 있지만 단일 객체를 변경하고 있습니다. 가치 이외의 다른 것으로 자바 스크립트를 전달하는 방법은 없습니다.
이 경우 원하는 것은 기본 개체의 복사본을 전달하는 것입니다. 개체를 복제하는 것이 유일한 방법입니다. 복제 방법에는 약간의 업데이트가 필요합니다.
function ShallowCopy(o) {
var copy = Object.create(o);
for (prop in o) {
if (o.hasOwnProperty(prop)) {
copy[prop] = o[prop];
}
}
return copy;
}