Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > this и литеральная форма


Автор: PsiMagistr 23.3.2018, 12:30
Код

var obj = {
    property: this,
    func: function{
        alert('Литеральная форма ' + this);
        //alert('Литеральная форма ' + this.property);
    }
}


window.onload = function () {
       obj.func(); //Выводит object НО ЕСЛИ заккоментировать строку   alert('Литеральная форма ' + this); и расскоментировать alert('Литеральная форма ' + this.property) - выводит window
    
}





Почему?


Автор: ksnk 23.3.2018, 12:52
alert - очень странная функция, со своими многочисленными тараканами и фенечками. В IE оно блокирует выполнение скрипта до закрытия окна, в Хроме - не блокирует, но тоже ведет себя не всегда ожидаемо. Лучше пользоваться для трассировки console.log
console.log('Литеральная форма ', this.property)

Автор: PsiMagistr 23.3.2018, 13:09
Цитата(ksnk @ 23.3.2018,  12:52)
alert - очень странная функция, со своими многочисленными тараканами и фенечками. В IE оно блокирует выполнение скрипта до закрытия окна, в Хроме - не блокирует, но тоже ведет себя не всегда ожидаемо. Лучше пользоваться для трассировки console.log
console.log('Литеральная форма ', this.property)

Кстати в декларативном классе все нормально. Всегда выводит object
Спасибо Вам. console.log() не повлиял никак.


Если использовать декларируемый класс то все хорошо, в любом случае.

Код

function ob() {
    this.property = this;
    this.func = function() {
        alert('Декларация ' + property); // Если this сюда поставить, тоже объект, а не окно.
    }
}

window.onload = function () {

    var object = new ob(); 
    object.func();

  
}

Автор: PsiMagistr 23.3.2018, 13:24
Не сохраняет свойство свою ссылку на this Даже если просто так сделать:

Код

var obj = {
    property: this   
}


window.onload = function () {
  
   console.log('Пробую читать this ' + obj.property);  //Получаю Window
   

}

Автор: PsiMagistr 23.3.2018, 14:12
Код

function ObjectClass() {
    this.that = this;
}


var obj = {
    that:this

}



window.onload = function () {

  var object = new ObjectClass();


  alert(object.that);
  alert(obj.that);
}



Самый простой пример.

Автор: ksnk 23.3.2018, 14:36
вообще-то this порождается конструкцией new. Не было new - нет и соответсвующей объекту области памяти, на который может указывать this. Так что все так и есть. Ну и так как в JS свято место редко бывает пусто - this в таком случае указывает на системный объект, как привило, - window

Добавлено через 4 минуты и 49 секунд
В случае 
Код

var obj = {
    that:this
}
 как раз именно и не было еще new. Сначала вычисляется значение объектного типа, потом оно присвается переменной obj.

Автор: PsiMagistr 23.3.2018, 14:50
Цитата(ksnk @ 23.3.2018,  14:36)
вообще-то this порождается конструкцией new. Не было new - нет и соответсвующей объекту области памяти, на который может указывать this. Так что все так и есть. Ну и так как в JS свято место редко бывает пусто - this в таком случае указывает на системный объект, как привило, - window

Добавлено @ 14:41
В случае 
Код

var obj = {
    that:this
}
 как раз именно и не было еще new. Сначала вычисляется значение объектного типа, потом оно присвается переменной obj.

Спасибо. Не знал. А где можно именно про этот нюанс прочитать? Получается, что в литералах и нет никакого this?

хотя например 

Код


var obj = {
    func:function(){
        alert(this);
    }

}


window.onload = function () {
    obj.func();
}






Автор: ksnk 23.3.2018, 15:55
Цитата(PsiMagistr @  23.3.2018,  14:50 Найти цитируемый пост)
хотя например 

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

Автор: PsiMagistr 23.3.2018, 16:07
Цитата(ksnk @ 23.3.2018,  15:55)
Цитата(PsiMagistr @  23.3.2018,  14:50 Найти цитируемый пост)
хотя например 

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

То есть свойствам литорального объекта нельзя присвоить значение его this?
Я верно понял?

Автор: ksnk 23.3.2018, 16:51
Код

var obj = {
    that:this
}

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

Автор: PsiMagistr 23.3.2018, 17:03
Цитата(ksnk @ 23.3.2018,  16:51)
Код

var obj = {
    that:this
}

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

Спасибо большое. А где можно по это подробно прочитать. Раньше я думал, что литеральный ничем не отличается

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)