JAVASCRIPT - Почему этот объект не изменился? - PullRequest
2 голосов
/ 29 декабря 2010
function myFunc(theObject) {  
  theObject = {make: "Ford", model: "Focus", year: 2006};  
}  
var mycar = {make: "Honda", model: "Accord", year: 1998};  
var x = mycar.make;     // returns Honda  
myFunc(mycar);  
var y = mycar.make;     // still returns Honda  

Почему myFunc не меняет объект mycar ??

Ответы [ 4 ]

9 голосов
/ 29 декабря 2010

Когда вы делаете theObject = { ... } в myFunc, вы создаете новый объект и присваиваете его ссылку на локальную переменную theObject.Это не меняет исходный объект.

Чтобы изменить содержимое исходного объекта, вам необходимо напрямую изменить его свойства следующим образом:

theObject.make = 'Ford';
theObject.model = 'Focus';
theObject.year = 2006;
2 голосов
/ 29 декабря 2010

На вопрос уже дан ответ, просто, чтобы сделать его еще яснее:

function myFunc(theObject) {  
      theObject = {make: "Ford", model: "Focus", year: 2006};  
} 

что-то похожее (забудьте синтаксис, получите сообщение):

function myFunc(theObject) {  
      theObject = new TheObject("Ford","Focus",2006);  
} 

другими словами, на параметр ссылаются, но вы изменяете эту ссылку, создавая новый объект.

Примечание. Поскольку синтаксис Java настолько популярен, я подумал об использовании JAVA-подобного синтаксиса, чтобы объяснить в дидактических целях, что вы создаете совершенно новый экземпляр. «TheObject» будет именем класса.

0 голосов
/ 29 декабря 2010

Измените это:

function myFunc(theObject) {  
      theObject = {make: "Ford", model: "Focus", year: 2006};  
    } 

Здесь вы переназначаете свою переменную на новый объект.Оригинал остается без изменений, поскольку параметр не связан с переменной, содержащей объект.

to:

function myFunc(theObject) {  
  theObject.make = "Ford";
} 

Это изменяет свойства объекта, которые вы передали.

0 голосов
/ 29 декабря 2010

Javascript изменяет локальную ссылку, а не исходную ссылку при внесении вами изменения. Этот пост на SO должен помочь:

Является ли JavaScript языком передачи по ссылке или передачей по значению?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...