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;
}