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; }
};