2009-01-08 5 views
0

J'ai ce morceau de code:String.replace; remplacer par des problèmes de résultat de la fonction

var myObj = function() { 
    this.complex = function (text) { /* long piece of code */ } 
    this.parse(text) { 
    return text.replace(/valid_pattern/gi, function ($1) { return this.complex($1); }); 
    } 
} 

Bien sûr appeler this.complex (1 $) ne fera pas l'affaire, parce que je suis dans le cadre de la fonction anonyme . Je ne peux pas non plus modifier la fonction anonyme en utilisant l'instruction .call (this), car dans le cas où je perdrais les paramètres passés à la fonction par String.replace. Jusqu'à présent, j'utilise l'instance concrète de l'objet. Ceci est ma solution:

var instance = new myObj; 
var myObj = function() { 
    this.complex = function (text) { /* long piece of code */ } 
    this.parse(text) { 
    return text.replace(/valid_pattern/gi, function ($1) { return instance.complex($1); }); 
    } 
} 

Jusqu'à présent, il est suffisant pour mes besoins, mais je me demande s'il y a une solution universelle à ce problème. La seule idée qui a fonctionné pour moi jusqu'ici est la suivante:

function ($1) { return (new myObj).complex($1); } 

... qui souffre de sérieux problèmes de performance. Toutes les idées seraient grandement appréciées.

- D.

P. S. Désolé mon anglais, ce n'est pas ma langue maternelle.

+0

Votre code n'a pas de sens! L'analyse est-elle censée être une fonction? – James

Répondre

4

Peut-être essayer:

var myObj = function() { 
    this.complex = function (text) { /* long piece of code */ } 
    this.parse(text) { 
    var that = this; 
    return text.replace(/valid_pattern/gi, function ($1) { return that.complex($1); }); 
    } 
} 

Il est l'un des trucs les plus utiles :-)

MISE À JOUR: L'astuce est pas à moi, je l'ai appris (comme la plupart des choses Je sais à propos de Javascript) à partir de: Douglas Crockford

+0

Ce "ça" résout le problème. : o) J'essaie d'éviter les variables d'assistance dans la mesure du possible. Mais je comprends de votre réponse, que cette approche est considérée comme une solution «standard» pour ce genre de situations. Merci! – Dero

0

déclarez une variable pour cela.

var myObj = function() { 
    var foo = this.complex = function (text) { /* long piece of code */ } 
    this.parse(text) { 
    return text.replace(/valid_pattern/gi, foo); 
    } 
} 
2

C'est ce que le prototype et d'autres font

// Monkey Patching, not everyone likes it 
Function.prototype.bind = function(obj) { 
    var _this = this; 
    return function() { 
     return _this.apply(obj, arguments) 
    } 
} 

Maintenant, vous pouvez le faire

var myObj = function() { 
    this.complex = function (text) { /* long piece of code */ } 
    this.parse = function(text) { 
    return text.replace(/valid_pattern/gi, function ($1) { return this.complex($1); }.bind(this)); 
    } 
} 

O = new myObj(); 
alert(O.parse('some text'); 
Questions connexes