Что значит ''this'', когда мы работаем с объектами в javascript?

Это пример моего сомнения, из-за которое помещать ему "this" сначала вместо того, чтобы только помещать его "wheels = 4" или "seats = 1", и т.д.: Чем мне может служить это в момент программирования?

var Car = function() {
  this.wheels = 4;
  this.seats = 1;
  this.engines = 1;
};
15
задан 25.06.2016, 06:23
3 ответа

В JavaScript this оно функционирует немного различно, что в ней mayorГ - в языков, ориентируемых на объекты.

  • , Когда используется this в одной funciГіn, что не назван из-за ningГєn объект, равняется глобальному объекту window.

    function hacerAlgo() {
        console.log(this); // window
    }
    
  • , Когда мы используем this внутри одной funciГіn, что существует внутри одной clase или objeto, он ссылается на clase или сами objeto.

    function Persona() {
        this.edad = 22; // this = Persona
    }
    
    var Persona = {
        calcAge: function() {
            console.log(this); // this = Persona
        }
    }
    

ВїPor quГ© помещать его "this" сначала вместо того, чтобы только помещать его "wheels = 4" или "seats = 1"?

Это cuestiГіn diseГ±o. В JavaScript требуют , чтобы использовать this в классах, чтобы обозначать, что вышеупомянутая переменная - собственность из класса. Если ты не используешь this, изменчивое счастье складируй в глобальном scope .

14
ответ дан 24.11.2019, 14:04
  • 1
    " он ссылается на класс или сам объект. и quot; это очень смущенная фраза. Javascript не работает с классами. (Java отличается от языков OOP не s и # 243; это в divisi и # 243; n, который ты делаешь, - а в котором нет классов). " funci и # 243; n, что существует внутри одной clase" не имеет чувства в Javascript. быть закрепленным много, который ни один из ответов не спрашивает у в SO , говорит " clases". – leonbloy 25.06.2016, 16:56
  • 2
    Пример, кажется, дает понять, что Persona - немного эксперт и # 237; как класс, и что binding this остается определенным в пользу синтаксиса (а именно, он решен во времени compilaci и # 243; n). Это не эксперт и # 237;. – leonbloy 25.06.2016, 16:58
  • 3
    Очевидно я делаю menci и # 243; n абстрактные для того, чтобы OP понял POO в модели prototipado. Не объясняй м и # 237; resp и # 243; ndele в OP. – gugadev 25.06.2016, 16:59
  • 4
    большое спасибо!!! – Ricardo A 26.06.2016, 10:11

Исправьте меня, если я ошибаюсь:

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

Представь, что у нас есть следующий код:

class Miclase
{
    private int X;
    public void SetX(int X)
    {
        this.X = X;
    }
}

Существуют языки программирования, главный подход которых идет к локальным переменным, перед любой другой вещью, я отношусь, если в коде SetX(X) клалось следующее:

X = X; 

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

Сделав this.X = X я говорю составителю, чтобы он распределил стоимость моего parametron X в частной переменной X что существует в моем классе.

Равный изюм с любым элементом, использовав слово this ты определяешь, что элемент, в который ты хочешь позвонить, состоит в том, что он считает уровень первенства больше "низким" из-за такого, называть это.

Где было бы возможно определять уровни первенства как:

Variables/Funciones Locales  (Prioridad 1)
Variables/Funciones Globales (Prioridad 0)

Равный изюм с функциями, представь, что в Системе существует так называемая функция Restar() и у тебя есть элемент, определенный с тем же именем внутри класса или любого другого объекта:

funcion Restar()  
{
    // Implementacion ...
}

По умолчанию на любом языке программирования, этом элементе, принадлежи классу или объекту большей категории, из-за которого, если мы звоним из той же инстанции в Restar(), у функции Системы будет больше важности, чем у той, которую ты определил.

funcion Main()
{
    Restar(); // Llama a la función del Sistema.
    this.Restar(); 
    // ^ Llama a tu definición siempre que se encuentre dentro de la misma clase
}    

В последнем месте, ключевом слове this функционируй как "указатель" (Если так возможно звонить ему) в настоящую инстанцию объекта, а следовательно все предыдущее упомянутый, оно может функционировать.

this: MDN (английский язык):

6
ответ дан 24.11.2019, 14:04

Как другие ответы говорят, ключевое слово (keyword) this он используется в нескольких языках. Типично в языках, ориентируемых на объект с классами (C ++ и Java в особенности). В этих языках, this это ссылка на "этот объект", и служит для того, чтобы определить, какой scope мы передаем, использовав имя переменной (или поле или свойство). В Javascript он похожий, но немного более разнообразный и сложный.

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

var persona = {
     edad : 25,
     esMayor : function() {
         console.log("evaluando esMayor() , this=" + this + " edad=" + this.edad);
         return this.edad >= 18;
     }
}

console.log(persona.esMayor());
persona.edad = 17;
console.log(persona.esMayor());

Если предыдущее оказывается ясным, нужно замечать пару вещей (прежде всего для тех, которые мы приходим из OOP с классами). Сначала: ощущаться, что мы не объявили ничего, что было бы похоже на класс, "является лично", а объект; против внешнего вида, давайте не обрежем (по крайней мере не легко) создавать несколько инстанций этого "человека". Секунда: мы могли бы осведомляться: "Действительно ссылка this она решена во время выполнения? в самом деле, здесь, this всегда будешь соответствовать в persona, нет?" Не, не обязательно. Пример:

var perro = { edad : 10, esViejo : persona.esMayor } ;
console.log("perro:" + perro.esViejo());

(Это важно, чтобы доводить до сведения, что то, что он импортирует, является объектом, который используется, чтобы призывать функцию, не объект, где "объявлена" функция.)

Итак, есть другая сцена незначительно отлично, специально и важно (в самом деле, он соответствует примеру вопроса). Есть в Javascript очень особенный тип функций, строители (язык, к сожалению, не дифференцирует их на синтаксическом уровне - в principo, любая функция может быть использованной, как строительный - в самом деле, это обычно не быть так - соглашение состоит в том, чтобы использовать mayúsuculas в имени).

var Car = function() {  // esto es (casi seguramente) un constructor
  this.wheels = 4;
  this.seats = 1;
};

"Нормальное" использование строителя - с ключевым словом new, что позволяет instanciar несколько объектов (не основываясь на "классе", а на строителе, который определяет прототип)

var car1 = new Car();
var car2 = new Car();

То, что происходит с призывом строителя с new... важно понимать это, но значимым здесь является поведение this: в этом случае, Javascript первом верьте в новый объект и потом назови строителя используя этот объект. Тогда, this, в этом контексте, укажи на новый созданный объект.

В конце концов: что происходит, если он используется this в глобальном контексте, (вне функции, или в функции, которая не названа как свойство объекта)? В таком случае, this укажи на "глобальный объект" (window). Странно, что один заинтересован в этом.

Для большего количества деталей, сходного вопроса в SO (английском языке)

1
ответ дан 24.11.2019, 14:04