2016-11-03 89 views
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()'); 
    } 
    } 
    // ... 
} 

现在它按预期工作。

回答

3

您的问题是,您将start方法作为类成员而不是类方法添加到JSClass
为了让你需要把它添加到原型的方法:

var JSClass = function() {} 

JSClass.prototype.start = function() { 
    console.log('JSClass.start()'); 
} 

那么这个:

let o2 = new TSClass(); 
o2.start(); 
o2.otherStart(); 

结果:

JSClass.start() 
TSClass.start() 
JSClass.start() 
TSClass.start() 
TSClass.otherStart() 
+0

你说得对,我没有想到这一点。不幸的是,我扩展了一个只使用属性方法的第三方库,但最终我只是喜欢在我的编辑中。 – martin