我正在开发一种基于javascript文本的游戏引擎。我有一个带有'onuse'方法的javascript对象。当我像这样使用它时,这非常有用:
var button = new CanvasObject();
button.text = "test" // Necessary for the next code sample
button.onuse = function(){ button.x += 1 }; // Some simple reaction;
我在Canvas对象中有代码,在绘制CanvasObject时会将其包装在span标记中,如下所示:
<span onclick = "function{ button.x += 1 }">test</span>
// Or to make the HTML cleaner:
<span onclick = canvas.callFunction(5)>test</span>
// where canvas.callFunction will call the function needed.
// Canvas keeps an array of functions that can be called.
Canvas将调用该函数,因为它使用“绝对”术语,行'button.x + = 1'将正常工作。问题是我有另一个从CanvasObject扩展的类,例如ButtonObject。我希望类定义具有已定义的onuse函数。例如(使用列出here的继承技术)
ButtonObject.method('onuse', function(){
this.x++; // Some function requiring 'this'.
});
当我使用第一种技术从HTML调用函数时,我的引擎只会将其称为匿名函数。然后,'this'将被定义为窗口。我希望ButtonObject的每个实例都具有相同的“onuse”函数,因此每次像使用CanvasObject一样定义它看起来像是很多额外的代码。我想到的一个可能的解决方案是修改我的引擎工作方式,使每个对象都被赋予一个'name'属性,这相当于它的javascript名称。通过这种方式,引擎可以像这样简单地编写字符串:
innerHTML += ( "<span onclick=' + buttonObjectInstance.name + ".onuse()'>" );
但是这种技术要求我每次实例化它时两次声明对象的名称,如下所示:
var startButton = ButtonObject('startButton');
这真的是我唯一的选择吗?或者有没有办法在对象的上下文中调用函数而不具有该对象的名称?
答案 0 :(得分:1)
将函数绑定到此以供以后使用:
ButtonObject.method('onuse', function(){
this.x++; // Some function requiring 'this'.
} .bind(ButtonObject) );
如果不是调用上下文中的ButtonObject,则将其绑定到保存方法的任何内容。