OK:
var Foo = new function(){
this.A = 1;
this.B = 2;
};
Wir var Foo = new
eine Funktion — haben, was bedeutet, dass die Laufzeit dieser Funktion mit this
Satz zu einem neu errichteten Objekt internen Prototyp dessen wird auf die aufruft Link gesetzt Wert der "Prototyp" -Eigenschaft dieser Funktion. Da dies nur eine anonyme Funktion ist, die direkt bei der Initialisierung instanziiert wird, ist ihre "Prototyp" -Eigenschaft nur ein einfaches leeres Objekt, so dass sie wirklich nichts bewirkt. Die Konstruktorfunktion initialisiert zwei Eigenschaften des neuen Objekts, und dieses neue Objekt ist der zurückgegebene Wert aus dem Ausdruck new
.Daher wird Foo
ein Verweis auf dieses konstruierte Objekt zugewiesen, und das Objekt verfügt über einige zugewiesene Eigenschaften. Es hat auch eine Prototypkette, die das leere Objekt von der anonymen Konstruktorfunktion enthält und danach den vom Objekterbauer geerbten Prototyp.
darin:
var Bar = {
A: 1,
B: 2
};
wir haben eine variable (Bar
) mit dem Ergebnis eines Objektinitialisierer Ausdruck festgelegt wird. Dadurch wird immer ein einfaches Objekt erstellt, das nur vom Objektprototyp erbt. Das Objekt Foo
unterscheidet sich nur dadurch, dass das Objekt Foo
in seiner Prototypkette ein zusätzliches (leeres) Objekt enthält.
So:
Foo
wird ist ein Ebene Objekt am Ende, keine Funktion.
Bar
wird auch ein einfaches Objekt, mehr offensichtlich keine Funktion. Foo
und Bar
werden ähnlich aber nicht identisch (na ja, zwei verschiedene Objekte sind nie gleich, aber ich mein in Bezug auf ihren besonderen Eigenschaften), weil Foo
, dass zusätzliches leeres Objekt in seiner Prototypkette hat.
Ja, Sie haben den Unterschied gefunden. Sie haben verschiedene Prototypen. –
Es gibt nicht viel praktischen Unterschied außer dem Unterschied im Prototyp, aber da der Prototyp nichts für das erste Objekt hat, tut es nichts. – Pointy
Sie können sehen, Foo als eine Klasse, aber Bar ist ein Objekt –