Kolink 是绝对正确的,只要您希望该值是一个字符串,那么您就可以将值“装箱”在一个对象中,然后覆盖toString方法。但是,所做的只是允许 javascript(当它需要将对象输出为字符串时)输出变量(通过本机调用toString
您)。它不是返回原始值,而是一个装在另一个对象中的值。
我想指出几件事情,让人们知道这两者是如何变化的(举几个例子)。所以,让我们看下面的部分:
var BoxedString = {
value: 'Hello, world!',
toString: function(){ return this.value; }
};
var BoxedNumber = {
value: 3.14,
toString: function(){ return this.value; }
};
var BoxedDate = {
value: new Date(), // today
toString: function(){ return this.value; }
};
很简单,我们可以在必要时将这些中的每一个输出为字符串(或者我们可以吗?)
// Each of these implicitly calls `.toString()` because we're concatenating
// them within another string. Metho calls (like `alert()` that look for a
// string result have the same effect.
console.log('BoxedString: '+BoxedString); // BoxedString: Hello, world!
console.log('BoxedNumber: '+BoxedNumber); // BoxedNumber: 3.14
console.log('BoxedDate: '+BoxedDate); // fail!
等等,BoxedDate
失败;这是为什么?因为我们toString
正在返回Date
对象并且不能按原样输出。但是,如果我们将其更改BoxedDate.toString
为 return this.value.toString()
,我们会看到更好的结果(继续尝试,我会等待。)
让我们BoxedDate
顺应潮流,试试日期法:
console.log(BoxedDate.getFullYear()); // BoxedDate.getFullYear is not a function
再一次,它实际上不是一个Date
,它是一个Date
包裹在一个闪亮的盒子里。奇怪的是,Javascript 足够了解隐式转换BoxedNumber
:
var sum = 38.86 + BoxedNumber; // 42 (works)
但是,不要尝试任何Number
对象方法,例如toFixed()
. 与BoxedString
和 字符串方法相同,例如.replace()
,toUpperCase()
和其他。
但是,如果我要在@Kolink 的答案中添加一些内容,那也将包括valueOf
作为对象声明的一部分。就像是:
var BoxedValue = {
value: 2013,
toString: function(){ return this.value.toString(); }
valueOf: function(){ return this.value; }
};