我想我錯過了這裏的理解相當豐富的東西,所以也許有一點解釋也是非常有幫助的。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可能是您的問題的合理解決方案。 –