2009-07-14 5 views
1

Je voudrais augmenter l'objet Function pour faire plus d'opérations lors de la construction d'un nouvel objet.
Est-ce possible?Puis-je effectuer des actions pendant la construction d'un objet en modifiant le prototype de fonction?

+1

Vous allez avoir besoin de fournir plus de détails ou votre question sera fermé. –

+0

Il semble que vous vouliez modifier le prototype de la fonction afin que vous puissiez exécuter du code à chaque fois qu'un objet est construit à partir d'une fonction ... Est-ce que c'est l'essentiel? – Prestaul

+0

@Prestaul: Oui. –

Répondre

2

Il est impossible de modifier le prototype de fonction afin de pouvoir intercepter des appels à une fonction. Le plus proche que vous allez obtenir est d'ajouter une méthode que vous pouvez appeler à la place d'un constructeur. Par exemple:

Function.prototype.create = function() { 
    var obj = new this(); // instantiate the object 
    this.apply(obj, arguments); // call the constructor 

    // do your stuff here (e.g. add properties or whatever it is you wanted to do) 
    obj.foo = 'bar'; 

    return obj; 
}; 

function SomeObject(name) { 
    this.name = name; 
} 

var obj = SomeObject.create('Bob'); 
obj.foo; // => 'bar' 

Sinon, vous pouvez écrire une fonction que vous appelez pour construire un constructeur:

Function.makeConstructor = function(fn) { 
    return function proxyConstructor() { 
     // check to see if they called the function with the "new" operator 
     if(this instanceof proxyConstructor) { 
      var obj = new fn(); 
      fn.apply(obj, arguments); 

      // do your stuff here (e.g. add properties or whatever it is you wanted to do) 
      obj.foo = 'bar'; 

      return obj; 
     } else { 
      return fn.apply(null, arguments); 
     } 
    }; 
}; 

var SomeObject = Function.makeConstructor(function(name) { 
    this.name = name; 
}); 

var obj = SomeObject.create('Bob'); 
obj.foo; // => 'bar' 
+0

ne pouvez-vous pas simplement brancher un événement? –

+0

Aucun événement ne se déclenche à chaque fois que vous appelez un constructeur d'objet. Le modèle d'objet javascript n'est pas associé à l'API DOM qui est l'emplacement du modèle d'événement du navigateur. Je pense vraiment que ceux-ci sont aussi proches que vous allez l'obtenir. – Prestaul

Questions connexes