Как "это" ключевое слово работает определенным образом? - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь выучить JavaScript, но застрял с проблемой (больше с непониманием ключевого слова "this"), которая не дает мне двигаться дальше.

Я просмотрел много контента оон и едва понял, но все еще есть некоторые проблемы.

У меня есть код:

function Person (name, age) {
  this.name = name;
  this.age = age;
  this.changeName = function (name) {
    this.name = name;
  }
}

Для чего мы здесь используем это?Как я понял, мы используем «this» для создания переменной внутри конструктора функции и присваиваем ей значение нашего параметра «name», чтобы мы могли ссылаться на него.Я прав?

Тогда у меня есть этот код:

var p1 = new Person ("John", 30);
p1.changeName ("Jane");
console.log(p1.name);

Когда я разобрался здесь, мы вызываем метод, который перезаписывает нашу переменную, на которую мы ссылаемся.Но это не меняет фактический параметр.Итак, если это правильно, почему мы используем это?Разве не имеет значения, что фактический параметр "name" изменился?

Весь код взят из обучающего приложения!

Ответы [ 3 ]

0 голосов
/ 27 апреля 2019

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

function Person (argument_name, argument_age) {
  this.name = argument_name;
  this.age = argument_age;
  this.changeName = function (argument_change_name) {
    this.name = argument_change_name;
  }
}

let p1 = new Person ("John", 30);
p1.changeName ("Jane");
console.log(p1);
0 голосов
/ 27 апреля 2019

Ключевое слово this используется для создания и присвоения значений переменным в классе.Он снова используется для создания функций, как получателей, так и установщиков.Так что в вашем коде this.changeName - это функция, которая при передаче значения меняет имя человека.например.

var a = 5; // a is an integer
var b = "Han"; //b is a string
var c = function(name){
  //code here
} // then c is also a function;
0 голосов
/ 27 апреля 2019

Так, если это правильно, почему мы используем это? Разве это не имеет значения, чтобы фактический параметр "name" изменился?

Нет, в этом примере нет необходимости делать это. changeName изменяет свойство объекта, созданного new Person.

Это правда, что этот пример кода немного странный, потому что он создает функцию changeName в конструкторе, но не делает того, что вы обычно делаете при создании функции в конструкторе. Я ожидаю, что этот код либо будет таким, что помещает changeName в прототип:

function Person(name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.changeName = function(name) {
  this.name = name;
};

(или class эквивалент) или это:

function Person(name, age) {
  this.getName = function() {
    return name;
  };
  this.changeName = function(newName) {
    name = newName;
  };
  this.getAge = function() {
    return age;
  };
}

Этот код обновляет параметр (что никак не влияет на код, вызывающий Person). Он вообще не создает name и age свойств; вместо этого он просто делает их значения доступными через getName и getAge. Также есть функция для изменения name (changeName); но нет функции для изменения age. Люди пишут такой код, чтобы age нельзя было изменить извне кода, созданного в конструкторе Person.

...