Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.12.2014, 15:37
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

Как граматно создать конструктор
НЕ ПУГАЙТЕСЬ ЧТО МНОГО ТЕКСТА, ТУТ ВСЕ ПРОСТО!!!

Решил попытаться переписать свой код, и столкнулся с огромным провалом в понимании ООП в javascript, связи с чем прошу вашей помощи в создании эдакого мануала.

Я работаю с элементам canvas, но думаю что логика подхода применительно к обычному диву будет такой же. Но не суть, ближе к делу.

Пусть у нас будут даны несколько элементов canvas:
...
<canvas id="canvasA"></canvas>
<canvas id="canvasB"></canvas>
<canvas id="canvasC"></canvas>
...

и располагаем мы таким набором говнокода (написанным применительно для одного canvas):

function init() { //функция инициализации canvas
        canvas = document.getElementById("canvas");
        ctx = canvas.getContext("2d");
    }
...
function animate() { //функция запускающая отрисовку
        requestAnimationFrame(animate);
        draw();
    }

//координаты мыши относительно элемента канвас
var xMouse=0
var yMouse=0
var HOLD=false
var WIDTH = canvas.offsetWidth
var HEIGHT = canvas.offsetHeight

function draw(){ //отрисовка
        ctx.beginPath();
        ctx.rect(0, 0, WIDTH , HEIGHT ); // очистка экрана
        ctx.fill();
        ctx.stroke();
        if (HOLD==false)
                ctx.strokeText(xMouse + " " + yMouse, 10, 10) // 10 10 -точка вывода координат мыши. 
        if (HOLD==true)
                ctx.strokeText("Click is true", 10, 10)
}

//обработчики:
canvas.onmousedown = myDown;
canvas.onmouseup = myUp;
canvas.onmousemove = myMove;

function myUp(e) { HOLD = false }
function myDown(e) { HOLD = true}
function myMove(e) {
        xMouse = e.pageX - canvas.offsetLeft
        yMouse = e.pageY - canvas.offsetTop
}


Итак, это пожалуй все что нам понадобиться.

Задача:
отображать на каждом canvas координаты xMouse, yMouse (координаты мышки относительно этого канваса, а не всей страницы), а в случае клика выводить надпись (как видите в случае клика меняется значение переменной HOLD, а в функции отрисовки есть проверка этой переменной)

Сложность:
Все что я написал действительно является ничем иным как говнокодом, который можно применить к одному единственному элементу canvas, я же хочу сделать универсальный конструктор, но не знаю как, и в этом прошу вашей помощи. Думаю этот урок может быть полезен и другим новичкам js в будущем!

Последний раз редактировалось Siend, 03.12.2014 в 15:39.
Ответить с цитированием
  #2 (permalink)  
Старый 03.12.2014, 17:30
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Все самое важное я написал вам в вашем прошлом посте.
Пример создания конструктора там тоже есть, могу кинуть второй:

var SomeConstructor = function(name) {
  this.name = name;
};
SomeConstructor.prototype.getName = function () {
  return this.name;
};

var vasia = new SomeConstructor("Вася");
var petia = new SomeConstructor("Петя");
alert([vasia.getName(), petia.getName()]);


Пишите что и где конкретно не получается - вам помогут. За вас нет желания переписывать.
Ответить с цитированием
  #3 (permalink)  
Старый 03.12.2014, 17:35
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

tsigel,
function SomeConstructor() {}

потому, что может пригодиться function.name (имя класса)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #4 (permalink)  
Старый 03.12.2014, 17:40
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

nerv_,
Ну не знаю. Однажды я брал так имя класса, когда делал одному из базовых классов метод который выдает всю цепочку наследования. Других использований имени класса не было нужно ни разу. К тому же я пишу на TypeScript (в больших проектах сильно помогают интерфейсы), там в генерируемых им классах имен в функции-конструкторе нет.
Ответить с цитированием
  #5 (permalink)  
Старый 03.12.2014, 17:44
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Кстати про TypeScript, я заметил что если писать обычный js код, то idea и webshtorm понимают интерфейсы написанные на TypeScript. Так что теоретически можно оттуда тока интерфейсы брать
Ответить с цитированием
  #6 (permalink)  
Старый 03.12.2014, 17:53
Профессор
Отправить личное сообщение для Siend Посмотреть профиль Найти все сообщения от Siend
 
Регистрация: 04.02.2012
Сообщений: 196

На примере Васи и Пети - все предельно понятно, даже про прототипы уже прочитал и тоже вообщем-то понял. В данном случае мы переопределили объект SomeConctructor, добавив в него метод возвращающий имя. К конкретному коду никаких вопросов нет.

Но не понимаю как это применить к моему случаю.
у меня сейчас можно сказать что существует уже 1 палитра с кучей переменных и функций их обработки, а хочу я чтобы для каждого canvas своя палитра создавалась, со своими переменными и функциями.

т.е. относительно вашего примера, нужно его усложнить так:
задан объект вася:

var vasia = {
name: "Vasia O_O",
age: 30,
friends: vasiaFriends
}

var vasiaFriends = ["Egor","Igor","SexyBitch"]

function addAge(){
vasia.age++
}

function addFriends(name){
vasiaFriends.push(name)
}


как теперь мне создать 2 васи и добавить одному из них нового друга, а другому увеличить возраст?

Последний раз редактировалось Siend, 03.12.2014 в 17:58.
Ответить с цитированием
  #7 (permalink)  
Старый 03.12.2014, 18:04
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от tsigel Посмотреть сообщение
Все самое важное я написал вам в вашем прошлом посте.
Пример создания конструктора там тоже есть, могу кинуть второй:

var SomeConstructor = function(name) {
  this.name = name;
};
SomeConstructor.prototype.getName = function () {
  return this.name;
};
В чем разница

var SomeConstructor = function(name) {
  this.name = name;
  this.getName=function(){
    return this.name;
  };
};


?

Последний раз редактировалось kostyanet, 03.12.2014 в 18:09.
Ответить с цитированием
  #8 (permalink)  
Старый 03.12.2014, 18:07
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Сообщение от Siend
как теперь мне создать 2 васи и добавить одному из них нового друга, а другому увеличить возраст?
function Person(options) {
  this.name = options.name;
  this.age = options.age;
  this.friends = options.friends;
}

Person.prototype.addAge = function() { this.age++ }
Person.prototype.addFriends = function(name) { this.friends.push(name) }

var vasia1 = new Person({
  name: "Vasia 1",
  age: 30,
  friends: ["Egor","Igor","SexyBitch"]
});

var vasia2 = new Person({
  name: "Vasia 2",
  age: 30,
  friends: ["Egor","Igor","SexyBitch"]
});

vasia1.addFriends('New friend');
vasia2.addAge();

alert( JSON.stringify(vasia1,'',2) );
alert( JSON.stringify(vasia2,'',2) );
Ответить с цитированием
  #9 (permalink)  
Старый 03.12.2014, 18:08
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

var SomeConstructor = function(name, age, friends) {
  this.name = name;
  this.age = age;
  this.friends = friends;
};
SomeConstructor.prototype.getName = function () {
  return this.name;
};
SomeConstructor.prototype.addAge = function () {
  return this.age++;
};
SomeConstructor.prototype.addFriends = function (friend) {
  return this.friends.push(friend);
};

var some1 = new SomeConstructor("a", 30, []);
var some2 = new SomeConstructor("b", 30, []);

some1.addAge();
some2.addFriends("gosha");

alert(JSON.stringify(some1,'',2));
alert(JSON.stringify(some2,'',2))


Эх, долго писал
Ответить с цитированием
  #10 (permalink)  
Старый 03.12.2014, 18:10
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Сообщение от kostyanet
В чем разница
При использовании прототипа метод getName будет у всех экземпляров общий, а без прототипов - у каждого экземпляра свой, что повлечет лишний расход памяти и проблемы с наследованием.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать кнопку, для проигрывания музыки! Как? Foleyer Общие вопросы Javascript 13 11.04.2013 16:43
Подскажите как создать пиксельную сетку sovereignsouls Элементы интерфейса 5 01.03.2013 10:37
Как создать задержку перед .html() Could jQuery 1 17.07.2011 13:42
Как создать Дата,время,открытие сайта Антон Internet Explorer 1 11.12.2008 22:44
как создать елемент с вложеными елементами scuter Events/DOM/Window 11 14.05.2008 16:15