Я пытался изменить переменную в конструкторе, используя функцию прототипа, но я получил неожиданные результаты - PullRequest
1 голос
/ 12 марта 2019

Я думал, что понял конструкторы и прототипы в javascript, пока не написал этот код и не получил неожиданные результаты ...

function Person() {
    var age = 18;
    Person.prototype.getAge = function() {
      return age;
    };
    Person.prototype.setAge = function(value) {
      age = value;
    }
    this.getAge1 = function() {
      return age;
    };
    this.setAge1 = function(value) {
      age = value;
    }
  };

  var marry = new Person();
  var jack = new Person();
  console.log(marry.getAge()); //output 18
  console.log(jack.getAge()); //output 18
  console.log(marry.getAge1()); //output 18
  console.log(jack.getAge1()); //output 18

  marry = new Person();
  jack = new Person();
  marry.setAge(22);
  console.log(marry.getAge()); //output 22
  console.log(jack.getAge()); //output 22
  console.log(marry.getAge1()); //output 18
  console.log(jack.getAge1()); //output 22

  marry = new Person();
  jack = new Person();
  jack.setAge(22);
  console.log(marry.getAge()); //output 22
  console.log(jack.getAge()); //output 22
  console.log(marry.getAge1()); //output 18
  console.log(jack.getAge1()); //outputv 22

  marry = new Person();
  jack = new Person();
  marry.setAge1(22);
  console.log(marry.getAge()); //output 18
  console.log(jack.getAge()); //output 18
  console.log(marry.getAge1()); //output 22
  console.log(jack.getAge1()); //output 18

  marry = new Person();
  jack = new Person();
  jack.setAge1(22);
  console.log(marry.getAge()); //output 22
  console.log(jack.getAge()); //output 22
  console.log(marry.getAge1()); //output 18
  console.log(jack.getAge1()); //output 22

почему я получаю одинаковые выходные данные после вызова marry.setAge (22) и jack.setAge (22)?

почему я получаю разные выходные данные после вызова marry.setAge1 (22) и jack.setAge (22)?

Является ли переменный возраст общим для объектов (джек и жениться)?

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Проблема скорее связана с замыканием, а не с прототипами.

Поскольку метод-прототип является общим для всех объектов, а ваш метод-прототип setAge обновляет возраст закрытия.

теперь каждый раз, когда высоздайте объект, он создаст для него новое замыкание, поэтому ваш прототип будет ссылаться на последнее созданное замыкание.

проверьте приведенный ниже пример, независимо от того, для какого объекта вы устанавливаете значение, оно всегда будет обновляться для последнего.

Вот почему в большинстве случаев не рекомендуется использовать прототип внутри функции.

см. Установка функции прототипа javascript в объявлении класса объекта для получения дополнительной информации.

function Person() {
	var age = 18;
	Person.prototype.getAge = function() {
		return age;
	};
	Person.prototype.setAge = function(value) {
		age = value;
	}
	this.getAge1 = function() {
		return age;
	};
	this.setAge1 = function(value) {
		age = value;
	}
};

marry = new Person();
jack = new Person();
marry.setAge(22);
console.log(marry.getAge()); //output 22
console.log(jack.getAge()); //output 22
console.log(marry.getAge1()); //output 18
console.log(jack.getAge1()); //output 22
console.log("---------------------------------------------")
jack = new Person();
marry = new Person();
marry.setAge(22);
console.log(marry.getAge()); //output 22
console.log(jack.getAge()); //output 22
console.log(marry.getAge1()); //output 22
console.log(jack.getAge1()); //output 18
0 голосов
/ 12 марта 2019
  • Person.prototype.getAge - это только одна функция, для которой та же переменная age
  • доступно в обоих объектах из-за Закрытие
    this.getAge1 является отдельным для каждого объекта. Так что это не меняет частную собственность, т.е. age другого объекта.

Когда вы используете Person.prototype.getAge = funct.... Обновляет getAge(). метод. для обоих объектов.

Но когда вы присваиваете this.get/setAge1 новое значение, оно не меняет getAge1() другого объекта.

...