Référence: http://ejohn.org/blog/simple-class-insanti-/
// makeClass - By John Resig (MIT Licensed) function makeClass(){ return function(args){ if ( this instanceof arguments.callee ) { if ( typeof this.init == "function" ) this.init.apply( this, args.callee ? args : arguments ); } else return new arguments.callee( arguments ); }; }
3 Réponses :
Comme je le comprends La solution de contournement est d'utiliser des fonctions anonymes nommées, si vous pardonnez à l'oxymoron. Vraiment, je devrais dire "Expressions de fonction nommées" . Un exemple: p> Le nom que vous fournissez, dans mon exemple Pour l'exemple de votre question Je ne sais pas comment gérer le arguments.callee code> n'est pas déprécié em> en mode strict, auquel cas vous pourriez continuer à l'utiliser; Au contraire, il a été supprimé em> et tentative d'utilisation sera (ou est censé) jeter une exception.
FunceXPressionName code> n'est pas censé être accessible de n'importe où sauf dans la fonction qu'il s'applique à, Mais malheureusement, c'est-à-dire que d'autres idées (comme vous pouvez le constater si vous Google IT ). P>
arg.Callee code> car je ne sais pas comment cela est défini par le Fonction d'appel, mais l'utilisation de
arguments.callee code> serait remplacée conformément à mon exemple. p> p>
Le code d'origine de John Resig échoue avec un constructeur sans paramètre.
this.init.apply( this, args && args.callee ? args : arguments );
L'idée ci-dessus donnée par nnnnnn em> est assez bonne. Et afin d'éviter les problèmes d'IE IE, je suggère la solution suivante. function makeClassStrict() {
var isInternal, instance;
var constructor = function(args) {
// Find out whether constructor was called with 'new' operator.
if (this instanceof constructor) {
// When an 'init' method exists, apply it to the context object.
if (typeof this.init == "function") {
// Ask private flag whether we did the calling ourselves.
this.init.apply( this, isInternal ? args : arguments );
}
} else {
// We have an ordinary function call.
// Set private flag to signal internal instance creation.
isInternal = true;
instance = new constructor(arguments);
isInternal = false;
return instance;
}
};
return constructor;
}