2016-11-03 88 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