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