Ho incontrato un problema di seguito con JavaScript (ES6)genitore che viene sovrascritto da bambino durante catena costruttore in JavaScript (ES6)
class A{
constructor(){
this.foo();
}
foo(){
console.log("foo in A is called");
}
}
class B extends A{
constructor(){
super();
this.foo();
}
foo(){
console.log("foo in B is called");
}
}
quello che mi aspetto è
foo in A is called
foo in B is called
ma in realtà si tratta di
foo in B is called
foo in B is called
so che posso risolvere questo semplicemente aggiungendo super.foo()
in classe funzione foo di B
class B extends A{
constructor(){
super();
this.foo();
}
foo(){
super.foo() // add this line
console.log("foo in B is called");
}
}
Ma immaginare uno scenario simile a questo:
bambino deve sostituire la funzione dei genitori al fine di fare alcuni lavori in più e impedire l'accesso da esterno poter accedere a quella originale.
class B extends A{
constructor(){
super();
this.initBar();
}
foo(){
super.foo();
this.bar.run(); //undefined
console.log("foo in B is called");
}
initBar(){
this.bar.run = function(){
console.log("bar is running");
};
}
}
Sembra che this
punti ancora da bambino B
, mentre la costruzione di genitore A
. Ecco perché non riesco a raggiungere il genitore A
's foo
.
Come faccio a rendere this
per chiamare la funzione di versione padre che viene sovrascritta da child durante la catena del costruttore?
Oppure c'è una soluzione migliore quando si tratta di uno scenario come questo?
Modifica
Così, dopo aver letto le risposte, la questione principale diventa -
E 'sconsigliato mettere initialize helpers
o setter functions
nel costruttore in JavaScript poiché i bambini hanno la possibilità di ignorare loro?
Per chiarire la situazione in modo più chiaro: (scusate per il mio precedente cattivo esempio :()
class A{
constructor(name){
this.setName(name);
}
setName(name){
this._name = name;
}
}
class B extends A{
constructor(name){
super(name);
this._div = document.createElementById("div");
}
setName(name){
super.setName(name);
this._div.appendChild(document.createTextNode(name));
}
}
new B("foo")
this._div
saranno undefined
questa è una cattiva idea, in quanto bambino sarà in grado di ignorare. la funzione?
class A{
constructor(name){
this.setName(name); // Is it bad?
}
...
}
Quindi non dovrebbe usare initialize helpers
o setter functions
a const ruttore come in Java, C++ ...?
Devo chiamare manualmente cose come questa new A().init()
per aiutarmi a inizializzare le cose?
* Come faccio a "questo" per chiamare la funzione di versione genitore * - 'super' è l'unico modo. – thefourtheye
Perché il costruttore 'A' chiama' this.foo() '? Non dovrebbe, dovrebbe solo inizializzare l'istanza. – Bergi
Il figlio 'pippo' ha lo scopo di scavalcare l'implementazione genitore nella causa generale, o stai chiedendo più come fare" pippo "ad un helper privato? – loganfsmyth