【问题标题】:Adding to a function through another javascript file通过另一个 javascript 文件添加到函数
【发布时间】:2011-12-21 05:00:22
【问题描述】:

嘿,我想知道如何添加到我的函数 draw(); draw 在我的画布引擎中用于更新其中的所有内容。我想要做的是创建一个独立的引擎,可以说是未经编辑的,但会更新与之链接的全新内容。例如-

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

现在说我创建了一个新应用程序并使用了这个引擎。我希望能够创建一个链接到引擎的独立文件,比如一个播放器对象。

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

现在我怎么能说将 playerupdate() 函数添加到 engine.js 的 draw() 函数而不编辑 engine.js 文件?这会像原型吗?如果是这样,即使不是这样,也将不胜感激!

如果您有任何问题,请询问,

提前致谢!

【问题讨论】:

    标签: javascript function object canvas


    【解决方案1】:

    我认为继承对于这个来说有点太复杂了......你可以用钩子来实现你想要的所有东西。

    试试这样的:

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

    【讨论】:

    • 谢谢,这正是我所需要的!
    • 嘿,我在玩这个,但是像 cameraWrapper(player) 怎么样?出于某种原因,如果函数在括号内有诸如 (player) 之类的东西,它不会让我推动这个?有什么想法吗?
    • 您可以将挂钩签名更新为 postDrawHooks.forEach(function(hook){hook(player)}); 并在您的函数中接受该参数...var playerUpdate = function(player){...};
    【解决方案2】:

    基本上它是一个原型。如果您不想让原型制作复杂化,您可以使用“自制”继承:

      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) 使其继承另一个“类”

    【讨论】:

    • 我还没有真正理解这一点...我对 javascript 和一般编程还是很陌生,但我想我很快就会需要它,并且会牢记这一点!谢谢!
    【解决方案3】:

    您是否有理由无法触发这些框架操作的事件?这样任何监听“draw”事件的东西都可以用这种方式挂钩他们的逻辑吗?如果不是实际事件,@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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 2019-09-06
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      相关资源
      最近更新 更多