Инициирование объекта внутри другого

#javascript #object #canvas #dom-events

#javascript #объект #холст #dom-события

Вопрос:

У меня есть часть программного обеспечения js, которая структурирована следующим образом:

 obj = new object[id]();

function wrapperFunction (e) {
    var pos = findPos(this);
    e._x = e.pageX - pos.x;
    e._y = e.pageY - pos.y;

    var func = obj[e.type];
    if (func) {
        func(e);            
    }
}
  

__

 obj.line = function () {    
    this.started = false;
    this.mousedown = function (e) {

    }

    this.mousemove = function (e) {
        if (this.started) {

        }
    }

    this.mouseup = function (e) {
        if (this.started) {

        }
    }
}
  

Приведенный выше блок кода дублируется для нескольких фигур, поэтому существует также obj.square obj.circle и т.д…

У меня также есть объект shape, который выглядит следующим образом.

 function Shape (type, color, height, width, radius, x, y) {
    this.type = type;
    this.color = color;
    this.h = height;
    this.w = width; 
    this.r = radius;
    this.points = ["x","y"];
    this.points["x"] = [x];
    this.points["y"] = [y];
};
  

Я хотел бы инициировать объект shape на mousedown для каждого объекта obj.* и заполнить объект shape информацией о propper.

Теперь о проблеме.

radius Вычисляется для каждого mousemove так же, как height и width , но когда я добавляю shapes = new Shape(circle, black, 10, 10, null, e._x, e._y) к mousemove , это выглядит так…

 this.mousemove = function (e) {
    if (this.started) {
        shapes = new Shape(circle, black, 10, 10, null, e._x, e._y);
    }
}
  

Объект shape не создается.

Если я создаю объект shape внутри функции-оболочки вместо mousemove , то объект инициируется, но я не могу использовать radius or height/width . Как я могу создать объект внутри другого объекта внутри функции-оболочки, чтобы я мог использовать вычисляемые термины внутри созданного объекта? Есть ли альтернативный маршрут, помимо того, что я делаю?

Комментарии:

1. Где код, который вызывает вышеупомянутое?

2. Используете ли вы какую-либо библиотеку JavaScript? obj = new object[this.id](); недопустимый ванильный JS — и в любом случае просто шаткий.

3. @Mattyeah Я использую jQuery Извините, если я слишком сильно трансировал свой код, я не хотел вставлять все. Я подумал, что это будет больно читать. this.id создается ли переменная в другом месте, предположим, что она соответствует линии, кругу, квадрату.

4. @Box9 что? Код, который вызывает функцию-оболочку, представляет собой jQuery при загрузке страницы.

5. Я имею в виду, что такое obj.line ? Как он создается? Как запускается mousemove событие, потому что я не вижу, чтобы оно было привязано к каким-либо событиям DOM? Здесь действительно недостаточно информации, которая могла бы помочь.

Ответ №1:

Помимо шаткости в obj = new object[this.id](); строке, я думаю, что вам просто не хватает this ключевого слова:

 this.mousemove = function (e) {
    if (this.started) {
        this.shapes = new Shape(circle, black, 10, 10, null, e._x, e._y);
    }
}
  

Редактировать только что заметил больше шаткости в вашем коде (да, это технический термин :). Я думаю, вы хотите изменить эти строки в конструкторе:

 this.points = ["x","y"]; // creates an array, which is indexed by numbers
this.points["x"] = [x];  // tacks on some ad-hoc properties to the array, which
this.points["y"] = [y];  // doesn't really make sense
  

к этому:

 this.points = {x: x,   // I think this is what you actually mean to do.
               y: y};
  

Комментарии:

1. Только что попробовал, и это не сработало, также после вашего редактирования. Объект по-прежнему не создается, когда у меня есть mousedown событие

2. Хорошо, я действительно не понимаю, что вы пытаетесь сделать, и как код, который вы нам показали, вписывается в общую картину. Я удалю этот ответ немного позже, но не могли бы вы показать нам демонстрацию (например, jsfiddle кода, который работает, и один из кодов, который не работает?

3. Благодаря тому, что вы добавили, и тому, что я начал добавлять материал в jquery, я получил ответ. Спасибо

4. Не могли бы вы отредактировать свой вопрос или опубликовать свой собственный ответ, чтобы показать нам, как вы устранили проблему?