JavaScript

Не понимаю смысл указателя this: зачем он нужен, к пример, в данной функции:

Function User() {
this.firstName = firstname;
this.lastName = lastName;

this. getFullName = function() {
return this.firstName + this.lastName;
}
}
Почему бы без this не писать:
firstName = ...
lastName = ...
this это как можно догадаться из названия ЭТОТ объект.
К примеру:
let user = {
name:"alex"
age:"14"
likeFruit:"banana"
sayHi: function() {
alert("Привет "+this.name+"!")
}
}
user.sayHi() //выведет Привет user!.
Если указать именно: alert("Привет "+uset.name+"!"), то при другом названии объекта (к примеру андрей) метод работать не будет.

this = Это. Или можно сказать контекст.
Сергей Кузнецов
Сергей Кузнецов
1 093
Лучший ответ
function getThis() {
console.log(this);
}
var obj = {
prop: 1,
prop2: 2
}
window.getThis();
getThis.call(obj)
>>>
Результат вызова будет различаться

Роман Шутяк
Роман Шутяк
70 420
Бауыржан Тулегенов console.log(this) - подразумевается, что выведется именно функция getThis, так? Если да, то какой смысл в этом this, если итак очевидно, что выведется данная функция, не говоря о том, что кроме нее других нет?
> Почему бы без this не писать...

Потому что, внезапно, это будет работать по другому.
При вызове функции-конструктора, this ссылается на объект, который сейчас создается.

let one = {
  a: 5,
  b: 10,
};

/***/
function Test() {
  this.a = 5;
  this.b = 10;
}

let two = new Test();

console.log( JSON.stringify(one) === JSON.stringify(two) ); // true;
// На выходе получаются два объекта одинакового содержания.

Конструкторы нужны, чтобы каждый раз из разных мест кода руками не прописывать объект через { ...}

>> Почему бы без this не писать:

Можно без this. При вызове функции, this ссылается на "объект перед точкой".
Если писать

function User() {
  let firstName = "firstname";
  let lastName = "lastName";

  this. getFullName = function() {
    return this.firstName + this.lastName;
  }
}

let user = new User();
console.log( user.getFullName() ); // NaN

При вызове функции, this — ссылка на объект user.

this.firstName + this.lastName; работает как user.firstName + user.lastName;

user.firstName — undefined (такого свойства в объекте нет), получается

undefined + undefined = NaN.
______________________________

Можно убрать this и из функции:

function User() {
  let firstName = "AAA";
  let lastName = "BBB";

  this. getFullName = function() {
    return firstName + lastName;
  }
}

let user = new User();
console.log( user.getFullName() ); // "AAABBB"

Называется замыкание - функция запоминает переменные из окружения, где она была объявлена. Функция уже будет работать, но это просто разные вещи. А у объекта по прежнему не будет свойств,

console.log( user.firstName ); // undefined
_____________

А при вызове функции из вопроса - будет доступ к user.firstName и user.lastName по отдельности.
Ты же сам вырвал конструктор из контекста в котором он создавался и спрашиваешь у нас зачем он нужен. Если не понимаешь сейчас, пока забей, поймёшь потом.
Ikromjon Juraboyev
Ikromjon Juraboyev
58 422