Bonjour à vous deux.
Je prendrais sans hésiter le code de Willpower avec le this.constructor, ca colle parfaitement à mes besoins.
Je suis d'accord avec vous et de prime à bord je serais tenté de dire qu'on doit se soumettre aux spécificités les plus fines du langage choisi pour en tirer tous les bénéfices.
Mais d'un autre côté je suis seul à gérer ce projet, je ne peux pas me permettre d'avoir deux structures pour une même chaîne de traitement.
Je passerai sur des choses comme le foreach par exemple qu'on ne trouve pas en JS mais qu'on peut reproduire avec jQuery entres autres.
Par contre sur des choses comme le nom des classes, la signature des méthodes et la portée des membres, je me sens forcé d'avoir les mêmes partout pour ne pas passer à côté de quelque chose plus tard. C'est uniquement dans ce but que je cherche à avoir les éléments basiques de la POO comme l'héritage et l'appel à self() ou parent (), pas par étroitesse d'esprit.
Dans un contexte objet voila ce que je retiendrai comme code, je doute qu'il soit aisé de se passer du nom de la classe dans un autre contexte :
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
|
Function.prototype.self = function(){
return this.constructor;
}
Function.prototype.extends = function(){
var FN = this;
var extends = function(FN,parent){
/*if(arguments.length>2){
parent = inherits.apply(this,[].slice.call(arguments,1));
}*/
var newFN = function(){
parent.apply(this,arguments);
this._super = this._super ? {_super:this._super} : {};
for(var i in this){
if(typeof this[i] == "function"){
this.super[i] = this[i];//(function(obj,fnName){ return function(){ return obj[fnName].apply(this,arguments); }; })(this,i);
}
}
return FN.apply(this,arguments);
};
var proto = function(){};
proto.prototype = parent.prototype;
newFN.prototype = new proto();
for(var i in FN.prototype){
newFN.prototype[i] = FN.prototype[i];
}
newFN._super = parent;
return newFN;
};
self().__PARENT = argument[0];
return extends.apply(window,[this].concat([].slice.call(arguments,0)));
};
Function.prototype.parent = function(){
return self().__PARENT;
} |
J'ai "désactivé" l'héritage multiple pour pouvoir mettre en place plus facilement l'accès au parent. De toutes façons il n'y a pas d'héritage multiple en PHP, Java ou ActionScript - autres langages utilisés - donc ça ne me gêne pas de ne pas l'avoir.
Qu'en pensent les pros?
Partager