Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.05.2014, 18:06
Аспирант
Отправить личное сообщение для niko42 Посмотреть профиль Найти все сообщения от niko42
 
Регистрация: 12.07.2012
Сообщений: 81

ООП javascript
Здравствуйте.
var Modal = function(){};

Modal.prototype.block = function(obj, content, time){

    var obj = $(obj);
    obj.after(content);

    var s = obj.next('div');

    time = (time == undefined) ? 4000 : time;

    for(var i = 0; i < s.length; i++){
        $(s[i]).delay(time).fadeOut(500);
        setTimeout(function(){
            $(s).remove();
        },time + 500);
    }

};

var Events = function(){
    this.modal = new Modal();
};

Events.prototype.addBasket = function(){

    $('.basket_bottom').on('click', function(){
        this.modal.block(this, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
    });

};

$(document).ready(function(){
    var e = new Events();
    e.addBasket();
});


Ошибка: Uncaught TypeError: Cannot read property 'block' of undefined

Направьте, пожалуйста, на путь истинный.

Последний раз редактировалось niko42, 23.05.2014 в 18:13.
Ответить с цитированием
  #2 (permalink)  
Старый 23.05.2014, 18:16
Аватар для nice_try
Профессор
Отправить личное сообщение для nice_try Посмотреть профиль Найти все сообщения от nice_try
 
Регистрация: 11.12.2013
Сообщений: 313

this у тебя указывает на $('.basket_bottom')

http://jsfiddle.net/hML4P/

Последний раз редактировалось nice_try, 23.05.2014 в 18:19.
Ответить с цитированием
  #3 (permalink)  
Старый 23.05.2014, 18:17
Аспирант
Отправить личное сообщение для niko42 Посмотреть профиль Найти все сообщения от niko42
 
Регистрация: 12.07.2012
Сообщений: 81

Сообщение от nice_try Посмотреть сообщение
this у тебя указывает на $('.basket_bottom')
Ясно, спасибо. А как обойти без создание var tmp ?

ТОбишь не писать такое:
Events.prototype.addBasket = function(){

    var tmp = this.modal;

    $('.basket_bottom').on('click', function(){
        tmp.block(this, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
    });

};
Ответить с цитированием
  #4 (permalink)  
Старый 23.05.2014, 18:22
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Events.prototype.addBasket = function(){
    $('.basket_bottom').on('click', function () {
        this.modal.block(this, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
    }.bind(this)); // тут вся соль
};


В ECMAScript6 можно сделать так:

Events.prototype.addBasket = function(){
    $('.basket_bottom').on('click', () => {
        this.modal.block(this, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
    });
};
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 23.05.2014 в 18:25.
Ответить с цитированием
  #5 (permalink)  
Старый 23.05.2014, 18:32
Аспирант
Отправить личное сообщение для niko42 Посмотреть профиль Найти все сообщения от niko42
 
Регистрация: 12.07.2012
Сообщений: 81

Сообщение от kobezzza Посмотреть сообщение
Events.prototype.addBasket = function(){
    $('.basket_bottom').on('click', function () {
        this.modal.block(this, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
    }.bind(this)); // тут вся соль
};
Uncaught TypeError: Cannot read property 'createDocumentFragment' of undefined

Сообщение от kobezzza Посмотреть сообщение
Events.prototype.addBasket = function(){
    $('.basket_bottom').on('click', () => {
        this.modal.block(this, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
    });
};
Uncaught SyntaxError: Unexpected token )
Ответить с цитированием
  #6 (permalink)  
Старый 23.05.2014, 18:41
Аспирант
Отправить личное сообщение для niko42 Посмотреть профиль Найти все сообщения от niko42
 
Регистрация: 12.07.2012
Сообщений: 81

kobezzza,
Честно говоря -
bind(this)); // тут вся соль
не понял.
Можете пояснить почему ?
Ответить с цитированием
  #7 (permalink)  
Старый 23.05.2014, 18:46
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

niko42,

Не заметил, что тебе нужен родной this от узла
block(this


тогда только через переменную замыкания

var tmp = this.modal;
.

***

Второй пример я привёл из будущего стандарта JS, он пока плохо поддерживается браузерами.

***

Что такое функция bind и как устроен this в JS в интернете over9000 статей.
__________________
kobezzza
code monkey
Ответить с цитированием
  #8 (permalink)  
Старый 23.05.2014, 19:00
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от kobezzza
bind
Кстати, почему jQuery не поддерживает handleEvent…
Мне больше нравится вариант:
var obj = {
    method: {

        element.addEventListener('click', {
            boundObj: this,
            handleEvent: function () {
                this.boundObj //→ obj
            }
        });

    }
};
чем через bind. Во первых не создается лишняя функция, во вторых свойства объекта никак не влияют на аргументы функции.
Ответить с цитированием
  #9 (permalink)  
Старый 23.05.2014, 19:19
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

тьфу ты, забыл, что handleEvent принимает объект события, походу переработал сёня

Events.prototype.addBasket = function(){
    $('.basket_bottom').on('click', function (e) {
        this.modal.block(e.target, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
    }.bind(this));
};
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 23.05.2014 в 19:33.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ООП в javascript. Алгоритмы построения приложений dmitry111 Оффтопик 17 08.06.2013 20:18
ООП в javascript iostream21 Общие вопросы Javascript 11 12.07.2012 00:16
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
JavaScript: ООП Ars_Art Общие вопросы Javascript 13 09.02.2010 02:32