Dies ist mehr darüber nachgedacht, wie Javascript funktioniert, als ein echtes Problem zu beheben. Im Falle einer Aussage wieAutomatische javascript type coercion
var str = 9 + " some words here";
Die resultierende str var würde den Wert "9 einige Wörter hier" enthalten. Meine Frage ist, welche Funktion Javascript verwendet, um das Number-Objekt '9' automatisch in eine Zeichenkette einzubinden, die mit dem String-Objekt 'einige Wörter hier' verkettet werden soll, und diese Funktion änderbar/ausschaltbar ist.
Dies begann von mir, die Ausgabe von einzelnen Ziffern mit einer vorhergehenden 0 auf einer Seite. Das war einfach genug, um mit einer schnellen Prototypfunktion auf der Anzahl Objekt
Number.prototype.SpecialFormat = function() {
if(this < 10) {
return "0" + this;
}
else {
return this.toString();
}
};
zu erreichen und es mit einem einfachen (9).SpecialFormat() + " words here";
nennt Aber das hat mich gefragt, ob ich die toString-Funktion auf einer Zahl mit einem überschreiben könnte
Number.prototype.toString = function() {
if(this < 10) {
return "0" + this;
}
else {
return this;
}
};
und nur javascripts automatische Konvertierung es für mich behandeln lassen, so konnte ich einen Standard 9 + " words here";
zu bekommen das gleiche Ergebnis „09 Worte hier“ verwenden. Dies funktionierte nicht nur implizit, ich musste am Ende die .toString zu der 9 (9).toString() + " words here"
hinzufügen (was bei näherer Betrachtung zu einigen Endlosschleifen geführt hätte).
Gibt es eine Möglichkeit, die eingebaute Funktionalität eines systemeigenen Javascript-Typs zu überschreiben?
* Anmerkung: Ich weiß, das ist wahrscheinlich eine 'schlechteste Idee jemals'
See [der Additionsoperator] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.6 .1) (Schritt 7), sowie [ToString] (http://www.ecma-international.org/ecma-262/5.1/#sec-9.8) und "[ToString angewendet auf den Zahlentyp] (http : //www.ecma-international.org/ecma-262/5.1/#sec-9.8.1) ". Es scheint, dass die abstrakte Operation "ToString (number)" niemals "Number.prototype.toString" verwendet (es ist in der Tat umgekehrt). – apsillers
Ich vermute, das ist der Grund, warum ich die "Maximale Call-Stack-Größe überschritten" Fehler, wenn ich String (this) im toString-Prototyp verwendet. –
Ich gehe davon aus, dass JavaScript in diesem Fall anders aufgebaut ist als andere objektorientierte Sprachen, in denen Sie Operatoren überschreiben können, die auf Objekte angewendet werden. Es scheint mir, dass String-Verkettung intern vom Interpreter ausgeführt wird, wobei alle überschriebenen Methoden ignoriert werden. – VisioN