5

Ich versuche, die Regeln zum Generieren von Klassennamen in Javascript zu bestimmen. Ich klebte dieses Skript in Chrome Entwickler-Tools-Konsole:Wie werden JavaScript-Klassennamen für benutzerdefinierte Klassen in Chrome Dev Tools berechnet?

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()); 

Und hier sind die Ergebnisse in der Konsole:

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

Es scheint, dass der Name der Klasse durch die Variable bestimmt wird, dass die Konstruktor-Funktion wurde ursprünglich zugewiesen. Ich suche nach den genauen Regeln, die CDT verwendet, um diesen Namen zu generieren. Ist dies derselbe Name, den der Google Closure Compiler erkennt?

Ich habe versucht zu sehen, ob ich ähnliches Verhalten in Firebug reproduzieren kann, aber ich kann nicht scheinen, Klassennamen zum Ausdrucken in der Konsole. Als eine zweite Frage, weiß jemand, wie man das in Firebug sieht?

Antwort

3

Es gibt keine Klassen in Javascript, da es sich um prototypbasierte OOP handelt, nicht um Klassen. Chrome führt offenbar einige Schlussfolgerungen aus, um eine Beschreibung des Objekts in der Konsole zu drucken, aber das ist kein Standard-Javascript - im Standard haben Objekte keine benannte Klasse, und Sie können den Namen der Klasse nicht herausfinden, zu der das Objekt gehört. da die einzige Vererbung durch die tatsächliche interne Pseudoeigenschaft [[Prototype]] erfolgt, die auch ein eigenständiges Objekt ohne Namen oder "Klasse" ist. Normalerweise könnten Sie etwas Ähnliches wie einen Klassennamen ableiten, indem Sie object.__proto__.constructor.name betrachten, was den Namen der Funktion zurückgibt, die der Konstruktor ist, von dem das Objekt instanziiert wurde; aber Diese Funktion ist möglicherweise anonym, oder Ihr Browser unterstützt möglicherweise die nicht standardmäßige __proto__ Eigenschaft, oder der Prototyp des Objekts enthält möglicherweise keinen korrekten Verweis auf seinen Konstruktor. Im Allgemeinen können Sie die "Klasse" eines Objekts in JS nicht kennen; Sie können nur für Nachkommenschaft (object instanceof Constructor) testen, aber das wird immer noch gemäß der constructor Eigenschaft im Objektprototyp implementiert, die könnte falsch sein.

+1

Also, wie ich befürchtet habe, kommt der Name, der von CDT ausgedruckt wird, nicht von den ecmascript-Spezifikationen. Es ist nur eine Debugging-Bequemlichkeit für den Entwickler. Ich bin ziemlich neu in Javascript und ich mag generell Prototyp-Stil, aber ich finde es enttäuschend, dass Bibliotheken wie Dojo und Extjs versuchen, in OO Stil der Programmierung schuhern. Ich denke, dass dies eine der besseren Eigenschaften von Javascript verwirrt. –

+1

Javascript ist eine _very_ OO-Sprache, und ist tatsächlich ziemlich flexibel darin. Es gibt viele Bibliotheken, die ein typisches klassenbasiertes OO-on-top von Javascript erstellen, und das funktioniert normalerweise ziemlich gut. Dies ist nicht unbedingt eine schlechte Sache für diese Bibliotheken oder Javascript selbst. – lanzz

Verwandte Themen