从html动态调用javascript对象函数

时间:2013-11-01 21:05:16

标签: javascript html function object

我正在开发一种基于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');

这真的是我唯一的选择吗?或者有没有办法在对象的上下文中调用函数而不具有该对象的名称?

1 个答案:

答案 0 :(得分:1)

将函数绑定到此以供以后使用:

ButtonObject.method('onuse', function(){
   this.x++; // Some function requiring 'this'.
} .bind(ButtonObject)  );

如果不是调用上下文中的ButtonObject,则将其绑定到保存方法的任何内容。