7
votes

L'instanciation de classe simple de John Resig et "Utiliser strict"

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


0 commentaires

3 Réponses :


4
votes

Comme je le comprends arguments.callee n'est pas déprécié en mode strict, auquel cas vous pourriez continuer à l'utiliser; Au contraire, il a été supprimé et tentative d'utilisation sera (ou est censé) jeter une exception.

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: xxx

Le nom que vous fournissez, dans mon exemple FunceXPressionName 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 ).

Pour l'exemple de votre question Je ne sais pas comment gérer le arg.Callee car je ne sais pas comment cela est défini par le Fonction d'appel, mais l'utilisation de arguments.callee serait remplacée conformément à mon exemple.


0 commentaires

1
votes

Le code d'origine de John Resig échoue avec un constructeur sans paramètre.

this.init.apply( this, args && args.callee ? args : arguments );


0 commentaires

2
votes

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


0 commentaires