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)?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage