如何在字符串原型扩展方法中使用字符串方法

时间:2016-11-02 19:10:23

标签: javascript prototype-programming

我有以下javascript方法:

String.prototype.includesAny = function(search) {
  var found = false;
  search.forEach(function(str) {
    if(this.toLowerCase().includes(str.toLowerCase())) {
      found = true;
    }
  });
  return found;
};

但它会引发错误:

  

this.toLowerCase不是函数

我认为这是因为此时this实际上并不是String的实例?有人知道我正在做的事情的正确方法(仍然使用原型范例)吗?

3 个答案:

答案 0 :(得分:1)

在javascript this中是函数作用域,因此创建新函数会创建一个新的this

你的forEach调用有一个回调,这是一个函数,在该函数中this不再是字符串,但很可能是窗口

解决方案是简单地存储对外部函数

this的引用
String.prototype.includesAny = function(search) {
    var found = false,
        input = this;
    search.forEach(function(str) {
        if (input.toLowerCase().includes(str.toLowerCase())) {
            found = true;
        }
    });
    return found;
};

Array.forEach还有一个可以使用的可选thisArg

String.prototype.includesAny = function(search) {
    var found = false;

    search.forEach(function(str) {
        if (this.toLowerCase().includes(str.toLowerCase())) {
            found = true;
        }
    }, this);
    return found;
};

甚至更好,请使用Array.some

String.prototype.includesAny = function(search) {
    return search.some(function(str) {
        return this.toLowerCase().includes(str.toLowerCase());
    }, this);
};

作为旁注,扩展原生原型通常是一个坏主意。

答案 1 :(得分:0)

您可能正确this不是字符串,因为您在foreach。因此,在输入this之前,将foreach的实例存储在变量中,然后使用该实例。

var stringToCheck = this;
search.forEach(function...

答案 2 :(得分:0)

您需要将this保存在其他变量中,以便在其他函数范围内使用它。