Страницы

Поиск по вопросам

пятница, 19 апреля 2019 г.

обращение к переменным объекта JavaScript

скажите почему след код не выводит измененое имя и возраст?
var person = (function (name, age) {  var   $name = name,      $age = age;    return {   name: $name,   age: $age,     setName: function (name) { $name = name;},     setAge: function (age) { $age = age;}  };   })('Gregory', 42);   person.setName('Miller'); person.setAge(30);   console.log(person.name); console.log(person.age);
Выхлоп:
Gregory 42


Ответ

Проблема в том, что сеттеры меняют локальные переменные, которые дальше нигде не получаются.
Значения полей name и age устанавливаются один раз и затем не изменяются.
Для исправления, вместо полей можно использовать геттеры
var person = (function(name, age) {   var   $name = name,     $age = age;    return {   get name() { return $name },   get age() { return $age },    setName: function(name) { $name = name; },     setAge: function(age) { $age = age; }   };  })('Gregory', 42);  person.setName('Miller'); person.setAge(30);  console.log(person.name); console.log(person.age);
Либо менять непосредственно поля объекта
var person = (function(name, age) {   return {   name: name, age: age, setName: function(name) { this.name = name; }, setAge: function(age) { this.age = age; }   };  })('Gregory', 42);  person.setName('Miller'); person.setAge(30);  console.log(person.name); console.log(person.age);
но в этом случае стоит следить за возможной потерей контекста вызова

Комментариев нет:

Отправить комментарий