1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
//fabrique un constructeur pour instancier un objet de type clsEnfant dérivé de clsParent
//Limitation : Les constructeurs ne doivent pas contenir d'arguments
//permet la surcharge de fonctions
//permet d'acceder aux fonction du parent par parent.nomfonction
function heriteDe(clsParent,clsEnfant)
{
function ConstWrapFonc(NomFonc,NbParams) //construit une fonction d'accès
{
var Result="";
var LstParams="";
var count=0;
while(count<NbParams) //ajouts des paramètre à la liste
{
if(count>0)
LstParams=LstParams+','
LstParams=LstParams+"par"+count;
count++;
}
Result="function("+LstParams+") { this.parent."+NomFonc+"("+LstParams+");}";
return Result;
}
function Constructeur() //definition du constructeur
{
this.parent=new clsParent(); //instancier un objet parent
for(var att in this.parent) //parcourir les acctibuts du parent
{
if(typeof this.parent[att]== "function")
{
//definir,depuis l'enfant, une fonction d'acces à la fonction parent
if(clsEnfant.prototype[att] == null) //exclure les fonctions surchargées par le prototype enfant
this[att]=eval(ConstWrapFonc(att,this.parent[att].arity));
}
else
{
//definir, depuis l'enfant, les getter et setter d'accès à la propriété parent
eval(" this."+att+" getter =function() {return this.parent."+att+"; }; "+
" this."+att+" setter =function(val){this.parent."+att+"=val; } ");
}
}
clsEnfant.apply(this); //appliquer le constructeur du modele enfant
//ajouter le prototype de la classe enfant
if(typeof Constructeur.initialized == "undefined")
{
for(var att in clsEnfant.prototype)
{
Constructeur.prototype[att]=clsEnfant.prototype[att];
}
Constructeur.initialized=true;
}
}
return Constructeur;
} |
Partager