toString() が返す値でしょう。オーバーライドするなら、こうです。
Date.prototype.toString = function() { return "hello, I am Date Class."; }
ああ。Dateクラスのをオーバーライドするとそうなりますね。ではクラス自体の作り方が良くないのでしょうか。。
表示結果はHELLO /undefined/
というのは、自分で作った HELLO クラスが console.debug で期待通りに表示できない、ということですか?こんな感じでいけると思いますが。
HELLO = function() {} HELLO.prototype.toString = function() {return "hello";}
そうです。期待通りに表示できないでした。そしてどうやら自己解決しそうなのですが、FireBug では(他のブラウザ/プラグインは知らないですが) 、console.debug(new SomeClass())とやると、toString結果 { constructor } という表示をしてくれるようです。⇒ と思ったがどうもそれも違った・・頂いた方法だとこうでます
hello { toString=function()}
toStringを忘れてるとかでは。
HELLO = function() {return 1} HELLO.prototype.toString = function() {return "hello";} console.debug(new HELLO());// hello { toString=function()} console.debug((new HELLO()).toString());// hello
忘れているのではなくて、クラス名だけ指定したときに FireBug が出してるこの {} のメッセージは、何の情報を拾っているのだろう? という素朴な疑問です。
code.google.com で、Firebug のソースを見てるんだけど、よく分からん。Firebug lite だったら、最終的には object + "" の文字列を出してるみたいなんだけど。http://code.google.com/p/fbug/source/browse/branches/firebug1.1/lite/firebug.js
あ、くそ、またa-kuma3に先を越されたwFirebugのソースを見ると、
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が想定の動作じゃないので、ちょっとアレです。事前に関数をラップしてるかもしれません。というか、安全のためにそうしてると思う。
こっちも、ようやく 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
↑あ、なるほど、それ正解っぽいですね。Firefox拡張の作り方わからないですが、プロパティをイテレータ風にして渡してる。amachangさんがちょこっと解説してるのを発見しました。 Firebug のコンソールに出力される形式を変える - IT戦記
で、domplate.js を読んでるんですが、{} の中にオブジェクトの何を出してるんだ、ということが分からない。reps.js の、
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() の結果が表示されているように見えるし。# 手強い ><
「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()}
簡単にしかソース読んでないですが、domplateは本当にテンプレートレンダラなんですね、これ。$|_とハッシュを使って記述するみたいですね。$が変数で、|がフィルタで、_がプロパティかな?
専用のレンダラがあるのか! >FirebugReps.DatesupportsObject() が true を返すクラスを使うのか。で、"|getValue" が FirebugReps.Date.getValue() を呼び出して、FirebugReps.Date.getValue() の実装が、
getValue: function(object) { return object.toString(); },
なんすね。typeof が "function" なやつは、OBJECTLINK("$object|summarizeFunction") だから、FirebugReps.Func.summarizeFunction() が呼ばれるんだ、と。どの実装が優先されるかは、reps.js の最後に書いてある Firebug.registerRep() の引数に書いてある順番なんだ。で、それらにマッチしないものが、Func と Obj のどちらかが呼ばれるんだ。
> 皆様す、すごい。。ありがとうございます。。
なんか、回答する側だけで盛り上がってしまい、すみませんでした。軽くまとめると、以下のような感じかと。
Twitterでのつぶやきはまだありません
トラックバックはまだありません
これ以上回答リクエストを送信することはできません。制限について
> 皆様
2012/01/30 01:46:12す、すごい。。ありがとうございます。。
なんか、回答する側だけで盛り上がってしまい、すみませんでした。
軽くまとめると、以下のような感じかと。
- console.log などの出力形式は、渡すオブジェクトの種類によって実装が違う
- 自前のオブジェクトなどは、オブジェクトのプロパティを列挙するような表示になる
- 自分の好みに合わせて出力を変えたいのであれば、Firebug の実装の一部をいじる必要がありそう
2012/01/30 01:58:39