0
我試圖覆蓋在JavaScript(ES5)所定義的對象的方法基於函數的類:重寫方法
var JSClass = function() {
this.start = function() {
console.log('JSClass.start()');
}
}
然後調用start()
方法打印按預期:
let o1 = new JSClass();
o1.start();
// prints: JSClass.start()
但是,如果我嘗試用打字稿類擴展這個對象,如:
class TSClass extends JSClass {
start() {
super.start();
console.log('TSClass.start()');
}
otherStart() {
this.start();
console.log('TSClass.otherStart()');
}
}
...然後TSClass::start()
永遠不會被調用。只有JSClass
中定義的start()
。
let o2 = new TSClass();
o2.start();
o2.otherStart();
這只是打印:
JSClass.start()
JSClass.start()
TSClass.otherStart()
我期望打印:
// by calling: o2.start();
JSClass.start()
TSClass.start()
// by calling: o2.otherStart();
JSClass.start()
TSClass.start()
TSClass.otherStart()
這是設計?那麼如何用TypeScript擴展ES5對象方法?
見現場演示:https://jsfiddle.net/martinsikora/2sunkmq7/
編輯:最後我用這個。
class TSClass extends JSClass {
constructor() {
var oldStart = this.start;
this.start =() => {
oldStart.call(this);
console.log('TSClass.start()');
}
}
// ...
}
現在它按預期工作。
你說得對,我沒有想到這一點。不幸的是,我擴展了一個只使用屬性方法的第三方庫,但最終我只是喜歡在我的編輯中。 – martin