Behält Chrome den Konstruktor jedes Objekts bei?
In der JavaScript-Konsole von Chrome:
> function create(proto) {
function Created() {}
Created.prototype = proto
return new Created
}
undefined
> cc = create()
Created {}
> cc
Created {}
Created
ist eine private Funktion dercreate
Funktion; nachcreate
Vollständig, es gibt keine (mir bekannten) Hinweise aufCreated
. Chrome kann den Namen der Funktion jedoch jederzeit anzeigen, beginnend mit dem von ihr erstellten Objekt.
Chrome hat dies nicht erreicht, indem es dem "naiven" Ansatz gefolgt ist:
> cc.constructor
function Object() { [native code] }
> cc.toString()
"object [Object]"
und sowieso habe ich nicht gesetztconstructor
auf derproto
Argument übergeben ancreate
:
> cc.__proto__.hasOwnProperty("constructor")
false
Eine Vermutung, die ich hatte, ist, dass die JavaScript-VM festhältCreated
um der willeninstanceof
Mechanismus. Es wurde gesagt, dassinstanceof
testet, ob ein Objekt in seiner Prototypenkette die Prototypeneigenschaft eines Konstruktors hat.
Aber im obigen Code habe ich getipptcreate()
effektiv vorbeiundefined
als Prototyp; FolglichCreated
hat nicht einmal seineprototype
auf den aktuellen Wert setzencc.__proto__
. Wir können dies überprüfen, wenn wir hackencreate
das aussetzenCreated
Funktion:
function create(proto) {
function Created() {}
Created.prototype = proto
GlobalCreated = Created
return new Created
}
Jetzt lass uns tippen
> cc = create()
Created {}
> GlobalCreated
function Created() {}
> GlobalCreated.prototype
undefined
> cc instanceof GlobalCreated
TypeError: Function has non-object prototype 'undefined' in instanceof check
Meine Fragen (alle eng miteinander verbunden):Was genau behält die JavaScript-Engine von Chrome bei, damit diese Objektpräsentation in der Konsole funktioniert? Ist es die Konstruktorfunktion oder nur der Funktionsname?
Ist diese Aufbewahrung für etwas Wesentlicheres als den Konsolendruck erforderlich?
Wie wirkt sich eine solche Speicherung auf den Speicherverbrauch aus? Was ist, wenn zum Beispiel die Konstruktorfunktion (oder sogar ihr Name) ungewöhnlich groß ist?
Ist es nur Chrome? Ich habe mit Firebug und Safari erneut getestet, ihre Konsolen präsentieren das Objekt nicht so. Behalten sie dennoch dieselben Daten für andere mögliche Zwecke bei (z. B. aufgrund eines echten Problems, das einer JavaScript-VM innewohnt)?