Kolinkは、値が文字列であると期待している限り、オブジェクト内の値を「ボックス化」してからtoStringメソッドをオーバーライドできるという点で絶対的に正しいです。ただし、JavaScript(オブジェクトを文字列として出力する必要がある場合)が変数を出力できるようにするだけです(ネイティブに呼び出すtoStringことにより)。元の値を返すのではなく、別のオブジェクトでボックス化された値を返します。
2つがどのように変化するかを知らせるために、いくつかの点を指摘したいと思います(いくつかの例を示します)。それでは、次の部分を取り上げましょう。
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を返すように変更すると、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; }
};