2016-11-03 3 views
0

Я пытаюсь переопределить метод объекта, определенного в JavaScript (ES5)-функции класса:Переопределение методов из функций на основе JavaScript классов в машинописном

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() никогда не называется. Только start() определяется в JSClass.

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() 

Является ли это дизайн? Тогда как я могу расширить методы объекта ES5 с помощью TypeScript?

Смотреть демо: https://jsfiddle.net/martinsikora/2sunkmq7/

Edit: Я в конечном итоге с помощью этого.

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

Смежные вопросы