人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

FireBug で、例えば

console.debug(new Date());

と指定したときに出てくる文字は、下のような感じになると思うのですが、

Date {Sun Jan 29 2012 13:13:04 GMT+0900}

このときに、{ ... } の間に出てくる文字は何なのでしょう。
自作のクラスで表示したい場合、どの関数をオーバーライドすれば良いでしょうか?

以下ののようにオーバーライドしただけでは

prototype.SomeClass.toString = function() { return "hello" }

表示結果は

HELLO /undefined/

のように出てしまいます。

●質問者: tenori_lion
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●200ポイント ベストアンサー

toString() が返す値でしょう。

オーバーライドするなら、こうです。


Date.prototype.toString = function() { return "hello, I am Date Class."; }


tenori_lionさんのコメント
ああ。Dateクラスのをオーバーライドするとそうなりますね。 ではクラス自体の作り方が良くないのでしょうか。。

a-kuma3さんのコメント
>> 表示結果は HELLO /undefined/ << というのは、自分で作った HELLO クラスが console.debug で期待通りに表示できない、ということですか? こんな感じでいけると思いますが。 >|javascript| HELLO = function() {} HELLO.prototype.toString = function() {return "hello";} ||<

tenori_lionさんのコメント
そうです。期待通りに表示できないでした。 そしてどうやら自己解決しそうなのですが、 FireBug では(他のブラウザ/プラグインは知らないですが) 、 console.debug(new SomeClass())とやると、 toString結果 { constructor } という表示をしてくれるようです。 ⇒ と思ったがどうもそれも違った・・ 頂いた方法だとこうでます >> hello { toString=function()} <<

Lhankor_Mhyさんのコメント
toStringを忘れてるとかでは。 >|| HELLO = function() {return 1} HELLO.prototype.toString = function() {return "hello";} console.debug(new HELLO());// hello { toString=function()} console.debug((new HELLO()).toString());// hello ||<

tenori_lionさんのコメント
忘れているのではなくて、 クラス名だけ指定したときに FireBug が出してるこの {} のメッセージは、 何の情報を拾っているのだろう? という素朴な疑問です。

a-kuma3さんのコメント
code.google.com で、Firebug のソースを見てるんだけど、よく分からん。 Firebug lite だったら、最終的には object + "" の文字列を出してるみたいなんだけど。 http://code.google.com/p/fbug/source/browse/branches/firebug1.1/lite/firebug.js

Lhankor_Mhyさんのコメント
あ、くそ、またa-kuma3に先を越されたw Firebugのソースを見ると、 >|javascript| summarizeFunction: function(fn) { var fnText = Str.safeToString(fn); var namedFn = /^function ([^(]+\([^)]*\)) \{/.exec(fnText); var anonFn = /^function \(/.test(fnText); return namedFn ? namedFn[1] : (anonFn ? "function()" : fnText); }, ||< というのがあって、それっぽい感じです。 けど、Str.safeToStringが想定の動作じゃないので、ちょっとアレです。事前に関数をラップしてるかもしれません。というか、安全のためにそうしてると思う。

a-kuma3さんのコメント
こっちも、ようやく reps.js にたどりつきましたよ。 Lhankor_Mhyが示したコードは、typeof (オブジェクト) == "function" ときに呼ばれるっぽい。 普通のオブジェクトだと、文字列を作ってるのが FirebugReps.Obj らしいんだけど... http://code.google.com/p/fbug/source/browse/branches/firebug1.9/content/firebug/chrome/reps.js?r=12539

Lhankor_Mhyさんのコメント
↑あ、なるほど、それ正解っぽいですね。Firefox拡張の作り方わからないですが、プロパティをイテレータ風にして渡してる。 amachangさんがちょこっと解説してるのを発見しました。 [http://d.hatena.ne.jp/amachang/20071018/1192707019:title]

a-kuma3さんのコメント
で、domplate.js を読んでるんですが、{} の中にオブジェクトの何を出してるんだ、 ということが分からない。 reps.js の、 >|txt| tag: OBJECTLINK( SPAN({"class": "objectTitle"}, "$object|getTitle "), SPAN({"class": "objectLeftBrace", role: "presentation"}, "{"), FOR("prop", "$object|shortPropIterator", " $prop.name", SPAN({"class": "objectEqual", role: "presentation"}, "$prop.equal"), TAG("$prop.tag", {object: "$prop.object"}), SPAN({"class": "objectComma", role: "presentation"}, "$prop.delim") ), SPAN({"class": "objectRightBrace"}, "}") ), ||< これを読み解け、ってことなんでしょうけど、オブジェクトのプロパティを列挙しているようにしか見えない。 Date は、toString() の結果が表示されているように見えるし。 # 手強い ><

TransFreeBSDさんのコメント
「[http://code.google.com/p/fbug/source/browse/branches/firebug1.9/content/firebug/chrome/reps.js?r=12539#2701:title=FirebugReps.Date = 〜]を見れば謎が解決するかと。 >> オブジェクトのプロパティを列挙しているようにしか見えない。 << ちなみに、この様になります。 >|| >>> hoge = function(){} function() >>> console.debug(new hoge()) Object {} >>> hoge.prototype.foo = "hoge_foo" "hoge_foo" >>> console.debug(new hoge()) Object { foo="hoge_foo"} >>> hoge.prototype.toString = function(){return "hoge_toString"} function() >>> console.debug(new hoge()) hoge_toString { foo="hoge_foo", toString=function()} ||<

Lhankor_Mhyさんのコメント
簡単にしかソース読んでないですが、domplateは本当にテンプレートレンダラなんですね、これ。 $|_とハッシュを使って記述するみたいですね。$が変数で、|がフィルタで、_がプロパティかな?

a-kuma3さんのコメント
専用のレンダラがあるのか! >FirebugReps.Date supportsObject() が true を返すクラスを使うのか。 で、"|getValue" が FirebugReps.Date.getValue() を呼び出して、 FirebugReps.Date.getValue() の実装が、 >|javascript| getValue: function(object) { return object.toString(); }, ||< なんすね。 typeof が "function" なやつは、OBJECTLINK("$object|summarizeFunction") だから、 FirebugReps.Func.summarizeFunction() が呼ばれるんだ、と。 どの実装が優先されるかは、reps.js の最後に書いてある Firebug.registerRep() の引数に書いてある順番なんだ。 で、それらにマッチしないものが、Func と Obj のどちらかが呼ばれるんだ。

tenori_lionさんのコメント
> 皆様 す、すごい。。ありがとうございます。。

a-kuma3さんのコメント
なんか、回答する側だけで盛り上がってしまい、すみませんでした。 軽くまとめると、以下のような感じかと。 -console.log などの出力形式は、渡すオブジェクトの種類によって実装が違う -自前のオブジェクトなどは、オブジェクトのプロパティを列挙するような表示になる -自分の好みに合わせて出力を変えたいのであれば、Firebug の実装の一部をいじる必要がありそう
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ