Non ti allargare troppo su quello che mi è chiaro e quello che non mi è chiaro, avrò le idee confuse su javascript forse, questo te lo concedo.
Se te mi dici che questo comportamento è normale per qualunque linguaggio OO, e che è dato dall'ereditarietà...allora quello che nn ha ben chiaro cosa singifichi ereditare sei te.
Ad esempio, lo stesso codice qui sopra rapportato al Java:
codice:
public class Test {
private String saluto;
public Test(){
}
public void setSaluto(String s){
saluto=s;
}
public void saluta(){
System.out.println(saluto);
}
}
public class SubTest extends Test{
public SubTest(){}
}
public class Main {
public static void main(String[] args) {
String saluto="saluto globale";
SubTest subtest1=new SubTest();
SubTest subtest2=new SubTest();
subtest1.setSaluto("ciao test1");
subtest2.setSaluto("ciao test2");
subtest1.saluta(); // ciao test1
subtest2.saluta(); //ciao test2
System.out.println(saluto); //saluto globale
}
}
Come vedi fa esattamente quello che uno si aspetti che faccia, ed è questa la VERA ereditarietà.
Il codice Javascript invece, che a quanto leggo dalla tua pillola sembrerebbe essere il corretto uso dell'ereditarietà, non fa la stessa cosa perchè la variabile privata "saluto" viene CONDIVISA e non EREDITATA.
Quindi, o ti sei sbagliato e questo non è il metodo corretto per ereditare, oppure javascript ha una "ereditarietà" finta, simulata, o quello che vuoi.
In un post nell'altro thread(da me aperto), ti avevo fatto notare che io facevo(erroneamente) l'ereditarietà in questo modo:
codice:
var saluto="saluto globale";
function Test() {
var saluto=null;
this.saluta = function() {
alert(saluto);
};
this.salutaTest = function() {
alert("Ciao Test");
};
this.setSaluto=function(s){
saluto=s;
}
};
function SubTest(){
this.extend=Test;
this.extend();
};
var subtest1 = new SubTest();
var subtest2=new SubTest();
subtest1.setSaluto("Ciao test1");
subtest2.setSaluto("Ciao test2");
subtest1.saluta(); // Ciao test1
subtest2.saluta(); // Ciao test2
alert(saluto); // saluto globale
Questo codice fa esattamente quello che ci aspetta da una vera ereditarietà, tranne il fatto,fondamentale lo so, che subtest non è instanceof Test.
Ma non essendoci polimorifismo in javascript(visto che non ci sono i tipi di dato), questo si avvicina di sicuro di più al concetto di ereditarietà del codice che hai scritto te.
Comunque riconosco che il tuo è il metodo corretto, anzi no, ancora no, ma basta aggiungere Test.call(this) per farlo corretto:
codice:
var saluto="saluto globale";
function Test() {
var saluto=null;
this.saluta = function() {
alert(saluto);
};
this.salutaTest = function() {
alert("Ciao Test");
};
this.setSaluto=function(s){
saluto=s;
}
};
function SubTest(){
Test.call(this,arguments)
//qualcosa
};
SubTest.prototype=new Test;
var subtest1=new SubTest();
var subtest2=new SubTest();
subtest1.setSaluto("Ciao test1");
subtest1.saluta(); // Ciao test1
subtest2.saluta(); // Ciao test2
alert(saluto); // saluto globale
ps. se ti sembrava tanto banale studia l'argomento, poi ci torni su ... consiglio spensierato