Quando faccio funzionare questo codice:eredità JavaScript magia
function foo() {
console.log("foo");
var self = this;
this.a = function() {
return arguments.length == 0 ? self.b : (self.b = arguments[0]);
};
};
function bar() {
};
bar.prototype = new foo();
var a = new bar();
var b = new bar();
console.log(a.a());
b.a(true);
console.log(a.a());
ottengo il seguente output: foo, undefined, true
Quello che non capisco è come l'oggetto restituito dalla funzione di costruzione foo
qualche modo riesce a destinare una nuova posizione di memoria per b
. Mi aspettavo totalmente che l'ultima uscita fosse true
perché ricevo solo l'output 1 foo
.
Questo funziona è fantastico, ma sembra troppo magico.
Il mio problema qui è che mi piacerebbe impostare un ordine di inizializzazione (o catena). Quello che ho capito è che foo
non può accettare alcun argomento, perché è chiamato solo una volta, per fornire una base (o un modello di ordinamento).
mi piacerebbe mettere a punto un molto semplice schema in cui foo
ha dei parametri che deve essere passato bar
-foo
(perché bar
eredita foo
). Sto bene con qualcosa come chiamare foo.apply(this, arguments)
da bar
ma la chiamata per impostare il prototipo deve essere fatta senza argomenti, quello che mi serve è un modo fluente per distinguere i due a parte.
Ma io davvero non voglio costruire un intero servizio intorno creazione di oggetti che consentono una sorta di eredità, l'unica cosa che mi interessa è costruire gli oggetti, in modo corretto ...
Mi viene registrato 'foo, undefined, true'. L'ultimo 'indefinito 'viene visualizzato in Strumenti per sviluppatori di Chrome, ma questo è solo il valore di ritorno di' console.log'. Hai solo 3 log comunque. – pimvdb
Sì, è vero, ho appena copiato dall'output della console di Chrome, ho perso ... –
Qual è esattamente la domanda? – user123444555621