我想我错过了这里的理解相当丰富的东西,所以也许有一点解释也是非常有帮助的。TypeScript自定义事件侦听器
我有一个类,因为这样的:
class Entity {
protected pos: number = [0,0];
...
public setPos(x: number, y: number) {
this.pos = [x, y];
}
}
,并希望类似
class EntityPositionListener {
//do stuff when an Entity position changes
}
我也有Entity
类的后裔。因此,任何时候任何后裔Entity
或Entity
本身都会更改pos
变量(在给定的实例中),我想知道它以便我可以更新地图上的位置,以及捕获实例以便我可以从理论上来说,对这个例子做其他事情。
我注意到Firefox有这个Object.watch()
命令,我发现有人在另一个问题上发布了一个“跨浏览器”的解决方案 - 无济于事 - 而且我已经尝试在类中“包装”Entity
类后启动阶段,但后者只是最终覆盖Entity
类或创建一个无限循环,所以我显然在某处丢失了点。如果包装是答案,我如何在TypeScript中做到这一点? JS版本创建了一个循环或没有工作。
//This created an infinite loop in runtime, but more importantly overwrote the Entity class
function EntityListener(name) {
cout(name);
}
var oldEntity = Entity;
function Entity(name) {
if (typeof EntityListener === "function") {
EntityListener(name);
}
oldEntity(name);
}
理想情况下,我想,听取他们对给定类几件事情 - 比如在游戏更新循环 - 只是用于演示这种特殊情况下。我发现了无数的链接,其中很多是JS,而不是明确的TypeScript,所以我真的很喜欢TypeScript解决方案和一些解释。我从根本上不理解如何去做这件事。
编辑
如果这是一个更好的版本问题,也许更简单地说,我怎么听Entity.setPos()
的被称为?
是否有可能更改此代码,使EntityPositionListener随时侦听在不修改setter函数的情况下调用Entity [set]?我对这个解决方案的保留意见是,我必须回过头来修改函数来激活侦听器中的功能,而不是让侦听器对任何称为该函数的类的实例进行操作。或者这是不可能的? – Matt
我已经更新了答案。说实话,我认为你会找到一种方法来做你想做的事。但是,它迟早会伤及IMO。我曾经做过一些疯狂的事情,所以我从我自己的经历谈起。 :-) –
你可以使用TypeScript装饰器吗? HTTP://计算器。com/questions/29775830/how-to-implement -a-typescript-decorator可能是您的问题的合理解决方案。 –