2010-10-31 29 views
0

J'essaye de modifier dynamiquement tous les objets dans Javascript afin que sa construction puisse être accrochée. Voilà ce que j'ai maintenant, qui fonctionne presque correctement:Comment obtenir un objet AOP-like avant que les crochets de construction dans Javascript correctement?

Function.prototype.beforeConstruction = function(newFunc) { 
    var oldObj = this; 
    var newObj = function() { 
     newFunc.apply(this, arguments); 
     oldObj.apply(this, arguments); 
    } 
    newObj.prototype = oldObj.prototype; 
    return newObj; 
}; 

Il est utilisé comme ceci:

someObj = someObj.beforeConstruction(function() { 
    //executed before someObj is constructed 
}); 

Maintenant, le problème est que si l'objet a des champs statiques comme celui-ci:

Ceux-ci seront perdus lors de la réinitialisation de l'objet à celui avec le crochet. La copie du prototype n'aide pas.

Quelqu'un peut-il m'aider ici? Gardez à l'esprit que cela doit fonctionner sans avoir besoin de modifier les objets existants (de sorte qu'il peut être utilisé pour les bibliothèques existantes).

Cordialement, Tom

Répondre

1

ne sais pas si c'est ce que vous recherchez, mais vous pouvez essayer en boucle sur toutes les propriétés du unObj original et la copie de leurs valeurs à newobj.

Function.prototype.beforeConstruction = function(newFunc) { 
    var oldObj = this; 
    var newObj = function() { 
     newFunc.apply(this, arguments); 
     oldObj.apply(this, arguments); 
    } 

    // copy static fields here. 
    for(var key in this) { 
     // This will not copy static fields of any base classes. 
     if(this.hasOwnProperty(key)) { 
      newObj[key] = this[key]; 
     } 
    } 

    newObj.prototype = oldObj.prototype; 
    return newObj; 
}; 

MozDev a un article expliquant hasOwnProperty - https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

+0

Pensez-vous que cela est la façon la plus efficace d'obtenir un travail de crochet beforeConstruction? – Tom