2016-11-02 4 views
0

Ich habe folgende Javascript-Methode:wie kann ich eine String-Methode in einer String-Prototyp Erweiterungsmethode verwenden

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

Aber es führt den Fehler this.toLowerCase is not a function

Ich denke das liegt daran, this nicht wirklich ist eine Instanz von String an diesem Punkt? Jeder kennt den richtigen Weg, um das zu tun, was ich tue (und benutze immer noch das Prototyp-Paradigma).

+0

Sie haben die Callback-Funktion nicht an 'this' gebunden. Verwenden Sie das ['thisArg'-Argument von' forEach'] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach). – trincot

+0

Grundsätzlich ein Duplikat von [Wie kann man auf den richtigen 'this/context innerhalb eines Callbacks zugreifen?] (Http://stackoverflow.com/q/20279484/218196) –

Antwort

1

in JavaScript-Funktion ist this scoped, so dass eine neue Funktion erzeugt eine neue this zu schaffen.

Ihr forEach Anruf hat einen Rückruf, der eine Funktion ist, und innerhalb dieser Funktion this ist nicht mehr die Saite, aber wahrscheinlich das Fenster

Die Lösung ist einfach eine Referenz zu speichern, was auch immer this in der ist Außen Funktion

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 hat auch eine optionale thisArg die verwendet werden können

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

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

Oder noch besser, verwenden Array.some

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

Als Nebenbei bemerkt, erstreckt nativen Prototypen generell eine schlechte Idee ist.

0

Sie sind wahrscheinlich über this nicht eine Zeichenfolge, weil Sie in der foreach sind. Speichern Sie daher eine Instanz von this in einer Variablen, bevor Sie die foreach eingeben und verwenden Sie diese stattdessen.

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

Sie müssen Ihre this in anderen Variablen speichern, um sie in anderen Funktionen zu verwenden.

Verwandte Themen