Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.01.2016, 10:40
Аватар для gruffi
Новичок на форуме
Отправить личное сообщение для gruffi Посмотреть профиль Найти все сообщения от gruffi
 
Регистрация: 16.08.2015
Сообщений: 6

[РЕШЕНО]Доступ к свойствам объекта из методов объекта
Добрый день, форумчане.
Помогите пожалуйста. Не могу обратиться к свойствам объекта из метода объекта. Есть объект:

Код:
var Shape = 
{
    CIRCLE_SHAPE:     4,
    LINE_SHAPE:       5,
    POLYGON_SHAPE:    6,
    RECTANGLE_SHAPE:  7,
 
    // properties
    _map:   null,
    _id:    null,
    _layer: null,
    _shape: null,
    _type:  null,
    
    // methods
    create: function(map, type, latlngs)
    {
        if(this._shape == null)
        {
            this._map  = map;
            this._type = (type == 'circle')?this.CIRCLE_SHAPE:(type == 'polyline')?
                               this.LINE_SHAPE:(type == 'polygon')?this.POLYGON_SHAPE:
                               (type == 'rectangle')?this.RECTANGLE_SHAPE:null;
            
            switch(this._type)
            {
                case this.CIRCLE_SHAPE:
                    console.log('shape: circle');
                    console.log('latlngs: ' + latlngs);
                    this._shape = L.circle(latlngs, latlngs.distanceTo(latlngs));
                break;
                
                case this.LINE_SHAPE:
                    console.log('shape: polyline');
                break;
                
                case this.POLYGON_SHAPE:
                    console.log('shape: polygon');
                break;
                
                case this.RECTANGLE_SHAPE:
                    console.log('shape: rectangle');
                break;
            }
            
            if(this._shape != null)
            {
                console.log('shape is created');
                this._id = BEGIN_NUMBER_SHAPE++;
                
                this._layer = L.featureGroup();
                this._map.addLayer(this._layer);
                this._layer.addLayer(this._shape);
            }
            
            this._map.on('click', this._onMouseClick);
            this._map.on('mousemove', this._onMouseMove);
            this._map.on('contextmenu', this._onMouseContextMenu);
        }
    },
    
    _onMouseClick: function(e)
    {
        console.log('_onMouseClick');
        console.log('current number shape: ' + this._id);
        console.log('type shape: ' + this._type);
    },
    
    _onMouseMove: function(e)
    {
        console.log('_onMouseMove');
    },
    
    _onMouseContextMenu: function(e)
    {
        console.log('_onMouseContextMenu');
    }
}
Вывод при клике мыши:

_onMouseClick
current number shape: undefined
type shape: undefined

Почему я не могу получить значения этих свойств?
Спасибо.

Последний раз редактировалось gruffi, 14.01.2016 в 17:16.
Ответить с цитированием
  #2 (permalink)  
Старый 14.01.2016, 14:05
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

Потому что _onMouseClick не содержит current number shape, type shape. Это же функция события, и this в данном случае будет указывать на объект обработчика событий (ну или как-то так, поправьте меня если я не прав). В качестве решения я бы попробовал:
var Shape = 
{
_this: this,
...
_onMouseClick: function(e)
    {
        console.log('_onMouseClick');
        console.log('current number shape: ' + _this._id);
        console.log('type shape: ' + _this._type);
    },
}


Хотя по сути должно работать и так:
_onMouseClick: function(e)
    {
        console.log('_onMouseClick');
        console.log('current number shape: ' + _id);
        console.log('type shape: ' + _type);
    }


P.S.: я не уверен в своих познаниях js, поэтому было бы хорошо если бы кто-то подтвердил или опроверг мой ответ)
Ответить с цитированием
  #3 (permalink)  
Старый 14.01.2016, 14:57
Аватар для gruffi
Новичок на форуме
Отправить личное сообщение для gruffi Посмотреть профиль Найти все сообщения от gruffi
 
Регистрация: 16.08.2015
Сообщений: 6

Спасибо. Сейчас сделал через Shape.*, но это конечно не совсем правильно, но мне подходит пока. Еще такой вопрос: у меня при обработке движения мышки отказывают правый и левый клик мыши. В чем может быть проблема?

Обработчик:
Код:
_onMouseMove: function(e)
{
        if(Shape._isDrawing && Shape._shape != null)
        {
            if(Shape._type === Shape.CIRCLE_SHAPE)
            {
                var center = Shape._shape.getLatLng();
                Shape._shape.setRadius(center.distanceTo(e.latlng));
            }
        }
},
Если закомментить строку с рисование фигуры
Код:
Shape._shape.setRadius(center.distanceTo(e.latlng));
то тогда все ок. Для рисования использую библиотеку leaflet.
Ответить с цитированием
  #4 (permalink)  
Старый 14.01.2016, 17:15
Аватар для gruffi
Новичок на форуме
Отправить личное сообщение для gruffi Посмотреть профиль Найти все сообщения от gruffi
 
Регистрация: 16.08.2015
Сообщений: 6

Все решил. Оказалось я использовал группу слоев L.featureGroup, и здесь присутствуют свои обработчики мышки, поэтому использовал простейшую группу слоев L.layerGroup и тогда все работает.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к значениям свойств объекта в цикле Bandicoot Общие вопросы Javascript 4 04.02.2016 11:44
Не получается получить доступ к свойству объекта Kinetic.Image Straj Общие вопросы Javascript 5 07.08.2014 12:44
Обход методов объекта Как? bogong Events/DOM/Window 5 13.09.2013 13:53
Доступ к свойствам объекта shifteee Общие вопросы Javascript 7 01.06.2012 17:27
доступ к свойствам parent обьекта avaVusal ExtJS 2 11.04.2011 14:40