5

javascriptでクラス名を生成するためのルールを決定しようとしています。私はクロームのdevのツールコンソールにこのスクリプトを貼り付け:Chrome Dev Toolsのカスタムクラスのjavascriptクラス名はどのように計算されますか?

var obj = { 
    Constr : function() { } 
}; 

var obj2 = obj; 
console.log(new obj.Constr()); 
console.log(new obj2.Constr()); 

obj2.Constr2 = function() { }; 
console.log(new obj.Constr2()); 
console.log(new obj2.Constr2()); 

そして、ここでは、コンソールでの結果は以下のとおりです。

obj.Constr 
obj.Constr 
obj2.Constr2 
obj2.Constr2 

クラスの名前は、コンストラクタ関数という変数によって決定されるようですもともとに割り当てられました。私はこの名前を生成するためにCDTが使用する正確なルールを探しています。また、これはGoogle Closure Compilerが認識する名前と同じですか?

Firebugで同様の動作を再現できるかどうかを確認しようとしましたが、クラス名をコンソールに表示することができません。二次的な質問として、誰かが火かき棒でこれを見る方法を知っていますか?

答えて

3

Javascriptにクラスはありません。これは、クラスベースではなく、プロトタイプベースのOOPであるためです。クロムは明らかにコンソール内のオブジェクトの説明を印刷するためにいくつかの演繹を行っていますが、標準のJavascriptではありません。標準では、オブジェクトには名前付きクラスがなく、唯一の継承は実際の[[Prototype]]内部擬似プロパティによって行われるため、名前も「クラス」もない独自のオブジェクトでもあります。通常、クラス名に似た何かを、object.__proto__.constructor.nameを見て推測すると、そのオブジェクトのインスタンス化されたコンストラクタである関数の名前が返されます。 しかしこの関数は、匿名であるかもしれない、またはお使いのブラウザは非標準__proto__プロパティをサポートしていない可能性があり、オブジェクトのまたはプロトタイプは、コンストラクタへの正しい参照が含まれていない可能性があります。一般的にJSのオブジェクトの「クラス」を知ることはできません。子孫(object instanceof Constructor)しかテストできませんが、オブジェクトプロトタイプのconstructorプロパティに従って実装されています。が間違っている可能性があります。

+1

私が恐れていたように、CDTによってプリントアウトされた名前は、ecmascriptの仕様から来ていません。これは開発者にとってのデバッグの便利さに過ぎません。私はJavascriptをかなり新しくしていますが、一般的にはプロトタイプスタイルが好きですが、dojoやextjsなどのライブラリはOOスタイルのプログラミングスタイルに挑戦しようとしました。私はこれがJavascriptの優れた機能の1つを混乱させると思う。 –

+1

Javascriptはほとんどすべての言語であり、実際にはかなり柔軟です。 Javascriptの上に典型的なクラスベースのオブジェクト指向を構築するライブラリがたくさんありますが、これは通常かなりうまくいきます。これらのライブラリやJavascript自体にとって必ずしも悪いことではありません。 – lanzz

関連する問題