Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> this и литеральная форма 
:(
    Опции темы
PsiMagistr
Дата 23.3.2018, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: нет
Всего: 1



Код

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


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





Почему?



Это сообщение отредактировал(а) PsiMagistr - 23.3.2018, 13:10


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
ksnk
Дата 23.3.2018, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
PsiMagistr
Дата 23.3.2018, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: нет
Всего: 1



Цитата(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();

  
}



--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 23.3.2018, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: нет
Всего: 1



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

Код

var obj = {
    property: this   
}


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

}



--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 23.3.2018, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: нет
Всего: 1



Код

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


var obj = {
    that:this

}



window.onload = function () {

  var object = new ObjectClass();


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



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

Это сообщение отредактировал(а) PsiMagistr - 23.3.2018, 14:14


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
ksnk
Дата 23.3.2018, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



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

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

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
PsiMagistr
Дата 23.3.2018, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: нет
Всего: 1



Цитата(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();
}







Это сообщение отредактировал(а) PsiMagistr - 23.3.2018, 14:57


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
ksnk
Дата 23.3.2018, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



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

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
PsiMagistr
Дата 23.3.2018, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: нет
Всего: 1



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

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

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


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
ksnk
Дата 23.3.2018, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Код

var obj = {
    that:this
}

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
PsiMagistr
Дата 23.3.2018, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: нет
Всего: 1



Цитата(ksnk @ 23.3.2018,  16:51)
Код

var obj = {
    that:this
}

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

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


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1398 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.