ma pippo non doveva essere condivisa? :master:codice:function Pippo(){ var pippo = 123; this.get = function(){ return pippo; }; this.set = function(){ pippo = 456; }; }; var a = new Pippo, b = new Pippo; b.set(); alert(b.get()); // 456, of course alert(a.get()); // 123, of course
Ancora, se usi metodi privilegiati, non stai usando l'ereditarietà JavaScript, che è un linguaggio a prototipi.
Cosa significa questo? Significa che di fatto non puoi veramente estendere Pippo perchè non stai utilizzando l'ereditarietà nativa di JavaScript.
Se tu assegni una prototype, che è un oggetto, dove gli oggetti non sono mai copie se non forzatamente ricostruiti, di fatto starai lavorando su un'unica istanza di Pippo.
Questo esempio mostra la vera ereditarietà JavaScript, dove il risultato sarà true in entrambi gli alert.codice:function Pluto(){}; Pluto.prototype = Pippo.prototype; alert((new Pluto) instanceof Pippo); alert((new Pluto) instanceof Pluto);
Cosa significa? ... significa che JavaScript supporta l'ereditarietà ma in modo diverso, e dire che Java è il RE dell'OOP significa far sbellicare dalle risate migliaia di sviluppatori ... ma non voglio spendere una sola unica parola sull'argomento, anche il discorso del polimorfismo mi ha fatto sorridere ... ed anche quello del JavaScript senza tipi di dati ... ma lasciamo perdere, continuiamo con il discorso dei privilegiati.
Nell'ultimo esempio vedi che Pluto ha un costruttore vuoto, e non avendo specificato i metodi in prototype di Pippo, è vero che lo estendi, come è vero che i metodi privilegiati get e set, interni al costruttore, non saranno ereditati.
Cosa succede allora se faccio questo?
Succede che come prototype avrai un'istanza di Pippo, ma non la prototype nativa di Pippo.codice:function Pluto(){}; Pluto.prototype = new Pippo;
Ergo la prototype è un'istanza con metodi privilegiati che overloadano la prototype, il che significa che ogni istanza di questo costruttore, che estende un'istanza, modificherà l'istanza stessa perchè è come usassi tanti riferimenti diversi ad un'unica istanza (new Pippo) perchè non sfrutti prototype ma privilegeds.
Cosa significa? Significa che più che condividere, semplicemente utilizzano tutti i metodi di quell'istanza. Paradossalmente puoi usare il sistema per un singleton, sempre ricordandosi che a loro volta sono istanze di Pluto e che se modifichi la proprietà di una, senza passare per i metodi definiti dall'istanza di new Pippo, perdi consistenza.
Ma uno che venera Java, dove tutto è getter / setter, questo non dovrebbe essere un problema, l'unico che hai, è voler pretendere di sapere tutto sulla programmazione ad oggetti perchè conosci Java ... fatti un giro in Python, PHP, C# ... e passa di volta in volta per JavaScript 3rd edition ... c'è da divertirsi, te lo assicuro
P.S. leggi qui prima: http://javascript.crockford.com/prototypal.html e qui poi http://javascript.crockford.com/javascript.html



Rispondi quotando