#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);
Комментариев нет:
Отправить комментарий