我有以下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
的实例?有人知道我正在做的事情的正确方法(仍然使用原型范例)吗?
答案 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
保存在其他变量中,以便在其他函数范围内使用它。