与string.replace;替换为功能结果问题

时间:2009-01-08 16:04:07

标签: javascript

我有这段代码:

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

当然,调用 this.complex($ 1)将无法解决问题,因为我处于匿名函数的范围内。我也无法使用 .call(this)语句重新定义匿名函数的范围,因为在这种情况下,我将丢失通过 String.replace

到目前为止,我正在使用该对象的具体实例。这是我的解决方案:

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

到目前为止,这足以满足我的需求,但我想知道这个问题是否存在任何通用解决方案。到目前为止,对我有用的唯一想法是:

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

......遭遇严重的性能问题。任何想法都将不胜感激。

- D。

P上。 S.对不起我的英语,这不是我的第一语言。

3 个答案:

答案 0 :(得分:4)

也许试试:

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

这是最有用的技巧之一: - )

更新:诀窍不是我的,我从({3}}

我学到了(就像我对Javascript的大部分知识)

答案 1 :(得分:2)

这就是原型和其他人所做的事情

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

现在你可以这样做

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

答案 2 :(得分:0)

为此声明一个变量。

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