2011-01-05 4 views
3

Ich habe eine Frage über this reserviertes Wort in JavaScript.Eine Frage zu "diesem" reservierten Wort in JavaScript

Check-out-Codes unter:

Function.prototype.method = function (name, func) { 
    if (!this.prototype[name]) { 
     this.prototype[name] = func; 
    }   
}; 

String.method('deentityify', function() { 

    var entity = { 
     quot: '"', 
     lt: '<', 
     gt: '>' 
    }; 

    return function() { 

     /*if (this === String.prototype) { 
      alert('true'); 
     } else { 
      alert('false'); 
     }*/ 

     return this.replace(/&([^&;]+);/g, 
      function (a, b) { 
       var r = entity[b]; 
       return typeof r === 'string' ? r : a; 
      } 
     ); 
    }; 
}()); 

document.write('&lt;&quot;&gt;'.deentityify()); 

Sie können Codes oben bearbeiten: http://jsfiddle.net/G3Tkm/

Meine Frage ist:

Was die in Zeile this reserviertes Wort ist 27 return this.replace(/&([^&;]+);/g, ist?

Ich denke: this === String.prototype, aber es ist nicht.

Der Typ '&lt;&quot;&gt;' ist ein String und der Typ this ist Objekt. Also this !== '&lt;&quot;&gt;'

Vielen Dank!

Antwort

5

Immer wenn ich ein this Schlüsselwort in JavaScript-Code finden sehe ich in der Regel nur nach oben, bis ich in die umgebende Funktion es ist zu finden.

Dann versuche ich zu verstehen, wie diese Funktion von der außerhalb aufgerufen wird. Dies ist wichtig, da sich der Wert this je nachdem ändert, wie die Funktion aufgerufen wird.

Von Ihrem Code scheint es, dass String.method() 's Aufgabe ist, Methoden zu der Prototypkette des String Objekts hinzuzufügen. Dies ist etwas, das Sie nicht wirklich tun sollten, es ist ein schlechtes JavaScript-Verhalten und könnte später zu Problemen führen.

jedoch aus Gründen der Erklärung, wenn Sie die deentityify Methode an einer Schnur nennen, wie "foo".deentityify() - nehme an, dies nennt, was Sie zugewiesen in String.method('deentityify', function() { - this in der Tat wird eine andere Funktion selbst (wenn String.method funktioniert, wie ich glaube,).

Also, wenn Sie "foo".deentityify()() verwenden, wird Ihr this auf den Anrufer verweisen, der "foo".deentityify() ist. Und der Anrufer von "foo".deentityify() ist in der Tat "foo" selbst.

Also im Grunde bezieht sich this in Ihrem Fall auf das String-Objekt, von dem Sie die Methode aufrufen.