Это стало больше размышлять о том, как работает javascript, чем о реальной проблеме для исправления. В случае заявления типаАвтоматическое принуждение типа javascript
var str = 9 + " some words here";
Результат str var будет содержать значение «9 слов здесь». Мой вопрос заключается в том, какую функцию использует javascript для автоматического принуждения объекта Number '9' к строке, которая будет конкатенирована с объектом String «некоторые слова здесь», и эта функция изменена/переопределена.
Это началось с того, что мне нужно было выводить одиночные цифры с предшествующим 0 на странице. Этого было достаточно легко выполнить с функцией быстрого прототипа на номер объекта
Number.prototype.SpecialFormat = function() {
if(this < 10) {
return "0" + this;
}
else {
return this.toString();
}
};
И называют это с помощью простого (9).SpecialFormat() + " words here";
Но у меня интересно, если я мог бы переписать функцию ToString на абонентский номер
Number.prototype.toString = function() {
if(this < 10) {
return "0" + this;
}
else {
return this;
}
};
, и пусть JavaScripts автоматическое преобразование обрабатывать его для меня, так что я мог бы использовать стандартный 9 + " words here";
, чтобы получить тот же результат «09 слова здесь». Это не просто неявно работало, я должен был добавить добавление .toString к 9 (9).toString() + " words here"
(что, если посмотреть дальше, привело бы к бесконечным циклам).
Так есть способ переопределить встроенные функции родного типа javascript?
* Примечание: Я понимаю, что это, скорее всего, «худшая идея когда-либо»
См [добавление оператора] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.6 .1) (шаг 7), а также [ToString] (http://www.ecma-international.org/ecma-262/5.1/#sec-9.8) и «[ToString Applied to the Number Type] (http : //www.ecma-international.org/ecma-262/5.1/#sec-9.8.1)». Похоже, что абстрактная операция 'ToString (number)' никогда не использует 'Number.prototype.toString' (на самом деле это наоборот). – apsillers
Я думаю, именно поэтому я получаю ошибку «Максимальный размер стека вызовов», когда я использую String (this) в прототипе toString. –
Я предполагаю, что в этом случае JavaScript построен иначе, чем другие объектно-ориентированные языки, где вы можете переопределить операторы, применяемые к объектам. Мне кажется, что конкатенация строк выполняется внутренне интерпретатором, игнорируя все переопределенные методы. – VisioN