JavaScript字符串替换函数丢失了类对象

时间:2014-06-25 19:10:34

标签: javascript regex class replace

使用JavaScript String替换为可选的函数参数时,它会丢失类对象。这个问题最好在包含以下代码的jsfiddle中得到证明。请注意,Person对象的“orig_last_name”永远不会更新,因为replace函数不能与Person对象一起使用。有没有办法将类传递给替换函数或者是否有更好的方法?

这个例子很简单所以我知道有一种更简单的方法可以解决样本问题,但是我的实际应用程序需要获取一个大字符串,找到要替换的模式,然后通过检查当前字符串来动态修改类对象被替换。最后一部分是我遇到问题的问题。

function Person() {
  this.full_name = "Bruce Wayne";
  this.last_name = null;
  this.orig_last_name = null;
}

Person.prototype.updateLastName = function() {
  // "this" is the Person object.
  console.log("in updateLastName()", this);
  this.last_name = this.full_name.replace(/\s+\S+$/g, this._replace_last_name);
}

Person.prototype._replace_last_name = function(s) {
  // "this" is now the Window object.
  console.log("in _replace_last_name()", this);
  this.orig_last_name = s;
  this.last_name = " Banner";
  return this.last_name;
}

var p1 = new Person();
p1.updateLastName();
console.log(p1.full_name, p1.last_name, p1.orig_last_name);

2 个答案:

答案 0 :(得分:2)

将方法作为回调传递时,不会传递与特定对象的关联。您可以使用.bind()来解决将创建临时存根函数的问题,该函数作为.replace()回调函数传递,并且存根函数将使用您的对象重新组合方法,如下所示:

Person.prototype.updateLastName = function() {
  // "this" is the Person object.
  console.log("in updateLastName()", this);
  this.last_name = this.full_name.replace(/\s+\S+$/g, this._replace_last_name.bind(this));
}

工作演示:http://jsfiddle.net/jfriend00/ZYsA9/

答案 1 :(得分:1)

当你获得对象中方法的引用时,它只是对函数的引用,它没有连接到对象。当它被调用时,上下文由它的调用方式决定,因此它成为全局上下文。

使用bind method设置函数引用的上下文:

this.last_name = this.full_name.replace(/\s+\S+$/g, this._replace_last_name.bind(this));