Страницы

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

понедельник, 10 февраля 2020 г.

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

#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

    


Ответы

Ответ 1



Проблема в том, что сеттеры меняют локальные переменные, которые дальше нигде не получаются. Значения полей 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); но в этом случае стоит следить за возможной потерей контекста вызова

Ответ 2



Решение через класс, на мой взгляд, нагляднее и большая возможность есть к расширению class Person { constructor (name, age) { this.name = name; this.age = age; }; setName (name) { this.name = name; }; setAge (age) { this.age = age; }; } let person = new Person ('Gregory', 42); person.setName('Miller'); person.setAge(30); console.log(person.name); console.log(person.age);

Ответ 3



var person = (function (name, age) { var $name = name, $age = 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);

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

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