5

Sto provando a determinare le regole per la generazione dei nomi di classe in javascript. Ho incollato questo script in Chrome strumenti dev console:Come vengono calcolati i nomi delle classi javascript per le classi personalizzate in Chrome Dev Tools?

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

Ed ecco i risultati nella console:

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

Sembra che il nome della classe è determinato dalla variabile che la funzione di costruzione è stato originariamente assegnato a Sto cercando le regole precise che CDT usa per generare questo nome. Inoltre, questo è lo stesso nome riconosciuto dal compilatore Google Closure?

Ho provato a vedere se riesco a riprodurre un comportamento simile in Firebug, ma non riesco a ottenere i nomi delle classi da stampare nella console. Come domanda secondaria, qualcuno sa come vedere questo in firebug?

risposta

3

Non ci sono classi in Javascript, poiché si tratta di OOP basati su prototipi, non di classi. A quanto pare Chrome fa qualche deduzione per stampare alcune descrizioni dell'oggetto nella console, ma non è Javascript standard - nello standard, gli oggetti non hanno una classe con nome e non è possibile capire il nome della classe a cui appartiene l'oggetto, dal momento che l'unica eredità è fatta attraverso la pseudo-proprietà interna [[Prototype]], che è anche un oggetto a sé stante, senza nome o "classe". Di solito, è possibile dedurre qualcosa di simile a un nome di classe guardando a object.__proto__.constructor.name, che restituirebbe il nome della funzione che è il costruttore da cui è stato istanziato l'oggetto; ma questa funzione potrebbe essere anonima, o tuo browser potrebbe non supportare la __proto__ proprietà non standard, o il prototipo dell'oggetto non potrebbe contenere un riferimento corretto al suo costruttore. In genere, non puoi conoscere la "classe" di un oggetto in JS; è possibile solo verificare la discendenza (object instanceof Constructor), ma è ancora implementato in base alla proprietà constructor nel prototipo dell'oggetto, che potrebbe essere non corretto.

+1

Quindi, come temevo, il nome stampato da CDT non deriva dalle specifiche ecmascript. È solo una comodità di debug per lo sviluppatore. Sono abbastanza nuovo in Javascript e generalmente mi piace lo stile prototipo, ma trovo deludente che librerie come dojo ed extjs provano a calzare in stile OO di programmazione. Penso che questo confonda una delle migliori caratteristiche di Javascript. –

+1

Javascript è un linguaggio _very_ OO e in effetti è piuttosto flessibile. Ci sono molte librerie che costruiscono un tipico OO basato su classi _ su top_ di Javascript, e che di solito funziona abbastanza bene. Questo non è necessariamente un problema per entrambe le librerie o JavaScript stesso. – lanzz

Problemi correlati