Добавление к функции через другой файл javascript - PullRequest
1 голос
/ 21 декабря 2011

Эй, мне было интересно, как я могу добавить в свою функцию draw (); Draw используется в моем движке canvas для обновления всего, что в нем. Я хочу создать автономный движок, который можно было бы оставить неотредактированным и в то же время обновлять совершенно новые вещи, связанные с ним. Например -

function draw(){
    gameloop();
    cameraWrapper();
    context2D.clearRect(0,0,canvas.width, canvas.height);
}

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

player = new object();
function playerupdate(){
     stuff;
     stuff;
}

Теперь, как я могу сказать добавить функцию playerupdate () в функцию draw () engine.js, не редактируя файл engine.js? это будет как прототип? если это так и даже если его нет, и пример будет принята с благодарностью!

Если у вас есть какие-либо вопросы, пожалуйста, задавайте,

заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 21 декабря 2011

Я думаю, что наследование слишком сложное для этого ... вы можете достичь всего, что хотите, только с помощью хуков.

Попробуйте что-то вроде этого:

var postDrawHooks = [];
var draw = function(){
    // do stuff
    postDrawHooks.forEach(function(hook){hook()});
}

var playerUpdate = function(){...};
postDrawHooks.push(playerUpdate);
1 голос
/ 21 декабря 2011

есть ли причина, по которой вы не можете инициировать события для этих базовых действий?что-нибудь, слушающее событие «ничья», может просто перехватить свою логику таким образом?если бы не фактические события, что-то вроде хуков, предложенных @sudhir jonathan, сработало бы, хотя я бы предложил создать метод для регистрации универсальных хуков, таким образом вы могли бы вызвать что-то вроде

game.register('draw',myFunctionReference);

и в игровом объекте

register : function (hook,func) {
    registeredHooks.push({'name' : hook, 'callback': func});
}

и в розыгрыше:

function draw(){
    gameloop();
    cameraWrapper();
    context2D.clearRect(0,0,canvas.width, canvas.height);
    for (i=0; i < registeredHooks.length; i++) {
        var hook = registeredHooks[i];
        if (hook.name == 'draw') hook.callback();
    }
}
1 голос
/ 21 декабря 2011

В основном это прототип. Если вы не хотите усложнять себя прототипированием, вы можете использовать «домашнее» наследование:

  Function.prototype.method = function(name, func) {
        this.prototype[name] = func;
        return this;
    };

  Function.method('inherits', function(parent) {
        var d = {}, p = (this.prototype = new parent());
        this.method('uber', function uber(name) {
            if(!( name in d)) {
                d[name] = 0;
            }
            var f, r, t = d[name], v = parent.prototype;
            if(t) {
                while(t) {
                    v = v.constructor.prototype;
                    t -= 1;
                }
                f = v[name];
            } else {
                f = p[name];
                if(f == this[name]) {
                    f = v[name];
                }
            }
            d[name] += 1;
            r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));
            d[name] -= 1;
            return r;
        });
        return this;
    });

Теперь для «класса» (в js такого нет, но это правильный термин) вы можете заставить его наследовать другой «класс», используя myCls.inherits (parentCls)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...