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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов метода из объекта через this генерирует, ошибку this.xxxxx(); is not a function 
:(
    Опции темы
Royan
Дата 13.4.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Код

        /**
         * Pseudo class for preloading images
         *
         */
        function ImageLoader() {
            this.imagePath = "./";
            this.errorOccured = false;

            //call function that will load images
            this.loadImages();
        }

        ImageLoader.prototype.loadImages = function() {    
            alert("hey yo!");
        }
    window.onload = ImageLoader;

Вот этот код написан внутри head'а 
Кто скажет почеу вызов this.loadImages(); is not a function получит плюсик!

PS
Сорри парни если это все спрашивалось уже и отвечалось, но я не нашел.


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
skyboy
Дата 13.4.2007, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



на что ссылается this в функции? ты же цепляешь loadImages как метод к объекту(через prototype),  а присоединяешь объект уже как функцию... может, надо так
Код

        /**
         * Pseudo class for preloading images
         *
         */
        function ImageLoader() {
            this.imagePath = "./";
            this.errorOccured = false;
            //call function that will load images
            this.loadImages();
        }
        ImageLoader.prototype.loadImages = function() {    
            alert("hey yo!");
        }
    window.onload = function() {new ImageLoader()};
? Т.е. чтоб ты создавал объект... Тогда this будет указывать на объект с методом loadImages, а пока что this в функции указывает на саму функцию...

Добавлено через 1 минуту и 41 секунду
Цитата(skyboy @  13.4.2007,  17:05 Найти цитируемый пост)
а пока что this в функции указывает на саму функцию

нет, сглупил. this указывает на window.
Вот попробуй запустить в консоли:
Код

function a0()
{
alert(this);
}
a0();

Получишь [bject Window]  smile 
PM MAIL   Вверх
butionok
Дата 13.4.2007, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



skyboy, 

Цитата

Получишь [bject Window]  


У меня [Object]. По моему this указывает на саму функцию a0.

Можно проще:
window.onload = function(){ImageLoader()};

Это сообщение отредактировал(а) butionok - 13.4.2007, 20:24
--------------------
Ненавижу убогую Оперу.
PM MAIL ICQ   Вверх
Sardar
Дата 13.4.2007, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(butionok @  13.4.2007,  19:19 Найти цитируемый пост)
По моему this указывает на саму функцию a0.

Цитата(butionok @  13.4.2007,  19:19 Найти цитируемый пост)
Можно проще:

Ничего не измениться, this будет указывать на window. Почему так уже много раз я с Zeroglif обсуждали.


Royan, что конкретно нужно сделать? Если использовать function(){ new ImageLoader(); }, то код будет работать, но смысла нет создавать объект. Если нужно просто вызвать ImageLoader, то создавай локальные переменные (var) и взывай loadImages как arguments.callee.prototype.loadImages хотя каков смысл класть её в прототип?

Если просто опишешь что нужно сделать (как можно более абстрактно, а не какой код ты хочешь получить), то придумаем элегантное решение.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Royan
Дата 14.4.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Всем спасибо за высказанные мысли, постараюсь прояснить ситуацию.
Я перейду на язык ООП хотя бы он и не совсем применим к JS. Я пытался создать класс ImageLoader в конструкторе которого хотел вызвать метод loadImages Хотя не совсем понимаю природу почему в приведенном выше примере this указывает на объект window, но аналогичная же ошибка возникает если просто поставить вызов ImageLoader() в конце всего кода или прописаеть его в событие onLoad в теге BODY.
Сейчас все, что мне нужно это просто вызвать метод из объекта.


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Sardar
Дата 14.4.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Royan @  14.4.2007,  11:27 Найти цитируемый пост)
Хотя не совсем понимаю природу почему в приведенном выше примере this указывает на объект window

Потому что вызываешь ты функцию как просто функцию, в таком случае ты вызываешь её как global.функция() (метод global), следовательно и this указывает на global. В бродилке объектом global является window (механизм за этим немного другой, но результат не меняется).

Вызов new ImageLoader() создаст новый объект и this будет указывать на него, всё что лежит в прототипе будет доступно. Спорным минусом такого подхода может быть то, что объект после не используется и сразу же убивается сборщиком мусора.

Рвение к "чистому ООП" конечно похвально, но в глупости это всё превращать тоже не стоит.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Royan
Дата 15.4.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Воспользовавшись советом переписал код так
Код

        /**
         * Pseudo class for preloading images
         *
         */
        function ImageLoader() {
            this.imagePath = "./";
            this.errorOccured = false;
            //call function that will load images
            this.loadImages();
        }
        ImageLoader.prototype.loadImages = function() {    
            alert("hey yo!");
        }

    function main() {
        var imgLoader = new ImageLoader();
        imgLoader.loadImages();
    }
        
    window.onload = main;



--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Alx
Дата 15.4.2007, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


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

Репутация: 10
Всего: 78



а нафика 2 раза вызывать imgLoader.loadImages() ?


--------------------
PM MAIL WWW ICQ   Вверх
Royan
Дата 16.4.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



Прошу прощения атавизмы:

Код

        /**
         * Pseudo class for preloading images
         *
         */
        function ImageLoader() {
            this.imagePath = "./";
            this.errorOccured = false;
            return this;
        }
        ImageLoader.prototype.loadImages = function() {    
            alert("hey yo!");
        }
    function main() {
        var imgLoader = new ImageLoader();
        imgLoader.loadImages();
    }
        
    window.onload = main;




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


 




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


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

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