6

javascript でクラス名を生成するための規則を決定しようとしています。このスクリプトを Chrome 開発ツール コンソールに貼り付けました。

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 で同様の動作を再現できるかどうかを確認しようとしましたが、クラス名をコンソールに出力できないようです。二次的な質問として、これをfirebugで見る方法を知っている人はいますか?

4

1 に答える 1

3

クラスベースではなくプロトタイプベースの OOP であるため、Javascript にはクラスがありません。Chrome はオブジェクトの説明をコンソールに出力するために推測を行っているようですが、これは標準の Javascript ではありません。標準では、オブジェクトには名前付きクラスがなく、オブジェクトが属するクラスの名前を特定することはできません。唯一の継承は、実際の[[Prototype]]内部疑似プロパティを介して行われるためです。これは、名前や「クラス」を持たない、それ自体がオブジェクトでもあります。object.__proto__.constructor.name通常、オブジェクトのインスタンス化元のコンストラクターである関数の名前を返すクラス名に似たものを で推測できます。ただし、この関数は匿名である、ブラウザが非標準の関数をサポートしていない可能性があります__proto__または、オブジェクトのプロトタイプにコンストラクターへの正しい参照が含まれていない可能性があります。通常、JS ではオブジェクトの「クラス」を知ることはできません。子孫 ( ) のみをテストできますが、オブジェクト プロトタイプobject instanceof Constructorのプロパティに従って実装されているため、正しくない可能性があります。constructor

于 2012-09-01T21:54:42.217 に答える