2016-04-08 15 views
3
var Foo = new function(){ 
    this.A = 1; 
    this.B = 2; 
}; 
var Bar = { 
    A: 1, 
    B: 2 
}; 
typeof Foo === "object" 
typeof Bar === "object" 

Was ist der Unterschied zwischen den beiden?Unterschied zwischen `new function() {this.x = 1}` und `{x: 1}`

Ich fand nur ihre __proto__ Objekte anders sein:

+1

Ja, Sie haben den Unterschied gefunden. Sie haben verschiedene Prototypen. –

+0

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

+0

Sie können sehen, Foo als eine Klasse, aber Bar ist ein Objekt –

Antwort

-1

Die erste ist eine Funktion Konstruktor, der ein Funktionsobjekt ausgibt (was zu Foo zugeordnet ist), und der andere ist nur eine einfache Javascript-Objekt.

+0

Sie haben die Tatsache übersehen, dass der Konstruktor ** über den Operator 'new' ** aufgerufen wird. – Pointy

+0

@Pointy Ich nehme an, er hat subtil angedeutet, dass durch "function constructor", aber genau zu sein wäre schön –

+0

@Ji_in_coding Foo ist nur ein Objekt; Es ist keine Funktion und es ist kein Konstruktor. – Pointy

-1

In Javascript sind alle Funktionen Objekte. Und in Ihrem Fall sind Foo und Bar gleich, aber Sie können das erste konstruieren.

Auf dem gleichen Grund, würde ich sagen, dass der Schlüssel Einsicht mit Konstruktorfunktionen in diesem Fall ist, dass wenn wir haben:

function myFoo(){ 
    this.A = 1; 
    this.B = 2; 
}; 

dann

var Foo1 = new myFoo(); 

die diese Kontext Foo ist .

var Foo2 = myFoo(); 

die dies an den aktuellen Kontext gebunden ist, (hat bedeutet, dass Sie tatsächlich Fenster = 1) das Fensterobjekt in diesem Fall.

Eine ausführlichere Beschreibung finden Sie in der MDN-Dokumentation.

Function

Constructor

new operator

+0

Ihre Antwort ist richtig, aber in diesem Fall sind weder Foo noch Bar Funktionen. Sie sind beide Objekte. – Pointy

+0

neue Funktion() {}, keine neue Funktion() {}(). – djechlin

+1

@djechlin das '()' ist optional! – Pointy

-1

Erste Notiz it's irrelevant that you omitted the parentheses when calling your anonymous function with new. JSLint wird dich anschreien, weil es verwirrend ist, das zu tun, aber genau das passiert.

Ich bin ziemlich sicher, dass der interne Prototyp der einzige Unterschied ist. Es kann einfacher sein, dies so zu schreiben, wie es normalerweise verwendet wird.

var Car = function() { 
    this.seats = 4; 
}; 

var car1 = new Car(); 
var car2 = { 
    seats: 4 
}; 

Lektüre dieses es ist mir klar, dass car1 ist ein Objekt, dessen interne Prototyp ist Car - die in Ihrem Fall ist eine anonyme Funktion nicht direkt von einer Variablen gehalten - und car2 ist ein Objekt, dessen interne Prototyp ist Gegenstand.

+0

Der Prototyp von "car1" ist der Wert der "Prototyp" -Eigenschaft von "Car", nicht von "Car" selbst. – Pointy

0

OK:

var Foo = new function(){ 
    this.A = 1; 
    this.B = 2; 
}; 

Wir var Foo = neweine 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.
Verwandte Themen