我有这段代码:
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.对不起我的英语,这不是我的第一语言。
答案 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 );
}
}