这已经变得更多的JavaScript的工作,而不是一个实际的问题要解决的思考。在一份声明中像自动javascript类型的强制
var str = 9 + " some words here";
的情况下得到的STR VAR将包含值“9一些话在这里”。我的问题是JavaScript使用什么函数将Number对象'9'自动强制为一个字符串与字符串对象“这里有些字”串联,并且此功能是可更改/可覆盖的。
这从我需要在页面上输出一个前面的0的单个数字开始。这是很容易的与Number对象
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;
}
};
,只是让JavaScript的自动转换处理它对于我来说,这样我就可以使用标准的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应用于数字类型](http ://www.ecma-international.org/ecma-262/5.1/#sec-9.8.1)”。看起来抽象操作'ToString(number)'从来没有使用'Number.prototype.toString'(事实上,这是另一种方式)。 – apsillers
我想这就是为什么当我在toString原型中使用String(this)时出现“超出最大调用堆栈大小”错误的原因。 –
我假设在这种情况下,JavaScript的构造方式与其他面向对象语言的构造方式不同,您可以重写应用于对象的运算符。在我看来,字符串连接是由解释器内部完成的,忽略了所有重写的方法。 – VisioN