2013-05-24 3 views
1

Может ли кто-нибудь пролить свет на это поведение? и как можно обрабатывать конфиденциально как экземпляр нового объекта? ThanksПочему этот объект javascript управляется?

var a = {}; 

var b = function(obj) { 
    obj.z = 10; 
    return obj; 
}; 

console.log("---"); 
console.log(a); // a = {} 
b(a); 
console.log(a); // a = {z: 10} -- why is a affected? it's not a = b(a); 
(function(obj){ 
    obj.x = 9; 
    console.log(obj); 
})(a); 
console.log(a); // a = {z:10, x: 9} -- a is also manipulated, why? 

EDIT: Доступ к объектам осуществляется посредством ссылки, поэтому «a» затрагивается в глобальном масштабе. Вопрос в том, что в сценарии Node.js эти объекты могут быть изменены разными точками входа пользователей, если экземпляр не изолирован/новый. идеи по этому поводу?

+6

Объект всегда передается по ссылке. – Passerby

+0

Просмотрите этот вопрос http://stackoverflow.com/questions/122102/most-efficient-way-to-clone-an-object –

+1

читайте это: [** JAVASCRIPT: ПРОХОД ИЗ СТОИМОСТИ ИЛИ ПО ССЫЛКЕ **] (http: //snook.ca/archives/javascript/javascript_pass) –

ответ

0

Когда вы отправляете переменную a в качестве параметра функции, это не копия объекта в a, которая отправляется функции, а ссылка на объект.

Параметр obj в функции будет ссылкой на тот же объект, на который указывает переменная a. Когда вы изменяете obj в функции, изменение влияет на сам объект. Когда вы позже используете переменную a, чтобы посмотреть на объект, вы увидите изменения.

+0

Имеет смысл, но как можно «а» обрабатывать как объект нового объекта, а не ссылаться на него? – Sagish

+0

@SagiIsha: Чтобы получить отдельные экземпляры, вам необходимо создать два отдельных экземпляра, нет возможности автоматически клонировать объекты. В некоторых библиотеках есть методы, которые можно использовать для клонирования объектов, таких как метод 'extend' в jQuery. – Guffa

Смежные вопросы