2017-09-15 106 views
3

我想扩展父类中特定方法的子功能。我仍然习惯于ES6中的OOP,所以我不确定这是可能的还是违反了规则。在JavaScript中的子类中扩展父类方法ES6

我正在寻找这样的事情:

class Parent { 
    constructor(elem) { 
    this.elem = elem; 

    elem.addEventListener((e) => { 
     this.doSomething(e); 
    }); 
    } 

    doSomething(e) { 
    console.log('doing something', e); 
    } 
} 

class Child extends Parent { 
    constructor(elem) { 
    // sets up this.elem, event listener, and initial definition of doSomething 
    super(elem) 
    } 

    doSomething(e) { 
    // first does console.log('doing something', e); 
    console.log('doing another something', e); 
    } 
} 

在本质上我想追加一个父类的方法一个儿童专用的回调。有没有一种创造性的方式来做到这一点,而无需创建一个具有相同功能的全新类?

+0

'extends'是每一个类,而不是每个实例。你想实现什么? – ideaboxer

+0

调整我的请求,只说“特定于孩子”,忽略我使用“实例”@ideaboxer – JLF

+0

*设置this.elem *应该在'super()'调用后发生... –

回答

3

可以在方法使用super

doSomething(e) { 
    super.doSomething(e) 
    console.log('doing another something', e) 
} 

在子类和父类this是同样的事情,指的是实际的对象,因此,如果调用的方法在父母的代码,它会呼吁孩子的实施,如果它确实是一个孩子。其他语言也适用,例如Python和Ruby。

工作代码:

class Parent { 
 
    constructor(elem) { 
 
    this.elem = elem 
 
    this.elem.addEventListener('click', (e) => { this.doSomething(e) }) 
 
    } 
 

 
    doSomething(e) { 
 
    alert('doing something') 
 
    } 
 
} 
 

 
class Child extends Parent { 
 
    constructor(elem) { 
 
    super(elem) 
 
    } 
 

 
    doSomething(e) { 
 
    super.doSomething(e) 
 
    alert('doing another something') 
 
    } 
 
} 
 

 
let child = new Child(document.getElementById('button'))
<button id="button">Alert</button>

+0

'super.doSomething(e)'在我的例子中被一个事件监听器调用。我想使用超级的事件监听器来触发孩子的方法作为回调 - 至少在之后。这个实现看起来只是通过一种不同的方法调用super的方法,导致我重新建立了在孩子中倾听的事件。 – JLF

+0

@JLF如果我理解你的话,一切都会按你的意愿工作。 –

+0

是的,这实际上是完美的。出于某种原因,我认为'super.doSomething(e)'会在没有父级上下文的情况下被调用。 – JLF