скажите почему след код не выводит измененое имя и возраст?
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);
но в этом случае стоит следить за возможной потерей контекста вызова
Комментариев нет:
Отправить комментарий