Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите в apply в requestAnimationFrame (https://javascript.ru/forum/misc/52165-pomogite-v-apply-v-requestanimationframe.html)

Siend 06.12.2014 17:05

Помогите в apply в requestAnimationFrame
 
Прочитал про .apply и интуитивно понимаю что мне его нужно использовать, но как - не понимаю.
...
animate: function () {
                A = this
                window.requestAnimationFrame(function () {
                    A.animate();
                    A.draw()
                });
            }

...
Эта функция - часть класса. Когда я создаю 1 объект этого класса - все хорошо, но когда я создаю 2 и более объекта, то функция работает исключительно с последним объектом - это логично, ведь она в каждом объекте переопределется. Но как мне сделать так, чтобы она не переопределялась, а просто каждый объект добавлял в нее свою функцию?

danik.js 06.12.2014 17:47

Добавь в начало скрипта, в самый верх:
'use strict';


Теперь, если скрипт перестанет работать - значит где-то была допущена ошибка, которая раньше просто тебе прощалась.

Siend 06.12.2014 17:56

Причем здесь это? поставил, но проблему это не выявило. Есть конкретная задача - добавить в requestAnimationFrame не одну функцию а несколько, с разных объектов, изнутри этих объектов.

т.е.
function G() {
            window.requestAnimationFrame(function () {
                testObj.draw()
                testObj.draw()
                testObj.draw()
                G()
            });
        }
        G()

работает нормально, но здесь я вне объектов объявил эту функцию. А я хочу чтобы она внутри каждого объекта вызывалась, непосредственно для этого объекта - и тут возникает проблема - функция переопределяется в каждом объекте... Мне кажется, что apply мог бы помочь, но не понимаю как его использовать ((

danik.js 06.12.2014 18:39

Цитата:

Сообщение от Siend
поставил, но проблему это не выявило

Давай код полностью. Где у тебя объявлена A? Почему ты сначала показал один код, а щас - другой?

Siend 06.12.2014 19:29

console.clear();

        if (!window.requestAnimationFrame) {

            window.requestAnimationFrame = (function () {

                return window.webkitRequestAnimationFrame ||
                window.mozRequestAnimationFrame ||
                window.oRequestAnimationFrame ||
                window.msRequestAnimationFrame ||
                function (callback, element) {
                    window.setTimeout(callback, 16.7);
                };
            })();
        }

        var Elements = {
            canvas: []
        }

        var Class = function () {
            var _class = function (canvas_element) {
                if (_class.init && typeof _class.init == "function") {
                    _class.init.apply(this, Array.prototype.slice.call(arguments));
                }
            };
            _class.fn = _class.prototype;

            _class.extend = function (prop) {
                for (var i in prop) {
                    _class[i] = prop[i];
                }
            };
            _class.include = function (prop) {
                for (var i in prop) {
                    _class.fn[i] = prop[i];
                }
            };
            return _class;
        };
        var T = 0;
        var CanvasControl = new Class();
        CanvasControl.extend({
            init: function (canvas_element) {
                this.canvas = canvas_element;
                this.canvas.width = canvas_element.offsetWidth;
                this.canvas.height = canvas_element.offsetHeight;
                this.ctx = this.canvas.getContext("2d");
                this.WIDTH = window.innerWidth;
                this.HEIGHT = window.innerHeight;
                this.canvas.onmousemove = this.myMove;
                Elements.canvas.push(this)
                this.EP = Elements.canvas.length-1
            }
        });
        CanvasControl.include({
            ClearStyle: function () {
                this.ctx.strokeStyle = "rgba(0,0,0,1)";
                this.ctx.fillStyle = "rgba(0,0,0,1)";
                this.ctx.lineWidth = 1;
            },
            RECT: function (x, y, w, h) {
                this.ctx.beginPath();
                this.ctx.rect(x, y, w, h);
                this.ctx.fill();
                this.ctx.stroke();
            },
            DrawText: function (s, x, y) {
                this.ctx.textBaseline = "middle";
                this.ctx.textAlign = "center";
                this.ctx.strokeText(s, x, y);
            },
            draw: function () {
                this.RECT(0, 0, 100, 100);
            },
            myMove: function (e) {
                //this.xMouse = e.pageX// - this.Cleft
                //this.yMouse = e.pageY// - this.Ctop

                console.log(this)
            }
        });

        var can1 = new CanvasControl(document.getElementById("canvasA"));

        function G() {
            window.requestAnimationFrame(function () {
                can1.draw()
                G()
            });
        }
        G()


Сейчас в конце, в функции G происходит вызов requestAnimationFrame, а до этого была функция animate внутри самого класса, которая пыталась вызывать requestAnimationFrame, но каждый следующий объект этого класса её перекрывал.

danik.js 06.12.2014 19:33

Цитата:

Сообщение от Siend
а до этого была функция animate внутри самого класса

Вот верни ее на место. И добавь use strict.

danik.js 06.12.2014 19:39

Siend, а че ты за поебень намутил. Какой-то непонятный Class. Внутри херня какая-то происходит. Какието extend'ы, include'ы.
Тебе че надо? Конструктор и набор методов? Ну тогда это так делается:


function CanvasControl() {
    // код конструктора
}

CanvasControl.prototype = {
    // тут методы
};


Все просто и понятно. Или у тебя задача - сделать так, чтоб хуй кто смог разобраться. Кста, ты уже вкурсе, что через некоторое время ты сам будешь смотреть на свой код как баран на новые ворота? Код почистую забывается, гарантирую.

И почитай какой-нибудь code style-guide. А то у тя хаос.
Конструкторы - с большой буквы. Инстансы, переменные, методы - с маленькой. Кэпслоком - константы.

Siend 06.12.2014 19:51

Ну, это имитация класса, как в с# XD

danik.js 06.12.2014 19:57

Цитата:

Сообщение от Siend
как в с#

А в моем примере тогда что? Или ты думаешь упомянул в коде слово Class, и твой код стал сразу заебатым? :D

Siend 06.12.2014 20:10

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


Часовой пояс GMT +3, время: 06:22.