Задать вопрос
meltmestnt
@meltmestnt
У верблюда два горба, потому что жизнь - борьба

Почему новый созданный объект конструктора не меняет локальные переменные конструктора?

Здравствуйте. Беспокоит вопрос, на который не могу найти ответ :
Почему при создании собственного конструктора ( в данном случае User ) второй созданный объект этого конструктора не меняет локальную переменную var firstname? Используя замыкание метод setFirstName второго объекта изменяет локальную переменную конструктора firstname. Затем, когда мы обращаемся к первому объекту и выводим его firstname, то оно остается прежним.
Не могу понять как это работает.
JSFiddle: https://jsfiddle.net/zaue36h9/90/
Код :
function User() {
  var firstname, surname;
  this.setFirstName = function(name) {
  	if (name.replace) {
    	firstname = name;
    }
    else {
    	throw new Error('Введите имя');
    }
  }
  this.setSurname = function(name) {
  	if (name.search) {
    	surname = name;
    }
    else {
    	throw new Error('Введите фамилию');
    }
  }
  this.getFullName = function() {
  	return firstname + ' ' + surname;
  }
  
}

var user = new User();
user.setFirstName("Петя");
user.setSurname("Иванов");

alert( user.getFullName() ); // Петя Иванов
var user2 = new User();
user2.setFirstName('Фёдор');
user2.setSurname("Марков");
alert( user2.getFullName() );
alert( user.getFullName() ); // Петя Иванов

Опять же, если провести аналогию :
function hi() {
	var hz = 15;
  (function() {
  	hz = 20;
    alert(hz);
  })();
  alert(hz);
}
hi();
то внешняя функция меняет переменную внутренней. Почему же так не работает первый случай?
  • Вопрос задан
  • 91 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 1
У вас два разных обьекта. Вы изменяете один и ожидаете изменение во втором? Я правильно понял?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
AngReload
@AngReload
Кратко о себе
Вы наверное забыли, что при каждом запуске функции User всё что внутри её будет запущено заново, в том числе создание пустых переменных firstname и surname. Чтобы создать замыкание код должен быть такой:

код убрал под спойлер
var firstname, surname;
function User() {
  this.setFirstName = function(name) {
    if (name.replace) {
    	firstname = name;
    }
    else {
    	throw new Error('Введите имя');
    }
  }
  this.setSurname = function(name) {
    if (name.search) {
    	surname = name;
    }
    else {
    	throw new Error('Введите фамилию');
    }
  }
  this.getFullName = function() {
  	return firstname + ' ' + surname;
  }
  
}

var user = new User();
user.setFirstName("Петя");
user.setSurname("Иванов");

alert( user.getFullName() ); // Петя Иванов
var user2 = new User();
user2.setFirstName('Фёдор');
user2.setSurname("Марков");
alert( user2.getFullName() );
alert( user.getFullName() ); // Уже не Петя Иванов

То что раньше было это тоже замыкание, но каждый новый объект замыкал свои версии firstname и surname.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 10:44
130000 руб./за проект
18 дек. 2024, в 10:02
7000 руб./за проект
18 дек. 2024, в 09:56
8000 руб./за проект