Javascript Funktionen und Objekte

9

Ich lerne Javascript, ich benutze PHP seit ungefähr 10 Jahren, also habe ich einige Kenntnisse von Javascript, meistens nur jQuery benutzend und es zusammen hackend, denke ich es ist Zeit, dass ich etwas Mühe gebe, es besser zu lernen, also bin ich gewesen lesen Sie es auf.

Nachfolgend finden Sie einige Beispiele zum Definieren und Aufrufen einiger Funktionen.

Methode 1

%Vor%

Methode 2

%Vor%

Methode 3

%Vor%

Methode 4

%Vor%

Ok, ich verstehe also, dass Methode 1 und 2 nur ein einfacher Funktionsaufruf ist.

1)
Methode 3 und 4 sind wo meine Fragen beginnen, aus anderen Post und aus dem Lesen kann ich nicht sagen, ob diese immer noch eine grundlegende Funktion mit Namespacing angewendet werden, oder wenn diese als Objekte betrachtet werden würden?

2)
Ich habe gesehen, wo manchmal ein Objekt mit dem new -Wort aufgerufen wird, aber das alles im Browser zu laufen funktioniert einwandfrei, also rate ich, dass das kein Objekt ist? Wenn es kein Objekt ist, wie würde ich es zu einem Objekt machen?

3)
Beispiel 3 und 4 sind ziemlich gleich, mit der Ausnahme, dass Beispiel 4 Funktionen hat, die 1 Stufe tiefer als Beispiel 3 definiert sind, gibt es einen Namen für Beispiel 3 und 4 oder werden sie als dasselbe betrachtet?

4)
Zuletzt von allen 4 Beispielen, ist irgendeine dieser 4 Methoden gegenüber der anderen bevorzugt?

Entschuldigung für alle Fragen in 1, aber sie sind alle verwandt und ich glaube nicht, dass ich dafür 4 separate Fragen starten muss.

    
JasonDavis 28.11.2011, 23:14
quelle

3 Antworten

4

3 ist ein Objekt. Es hat Objekteigenschaften, die selbst Eigenschaften haben, die Funktionen sind. 4 ist die gleiche Idee, nur mit weniger Verschachtelung.

Was die Verwendung des Schlüsselworts new betrifft, ist dies nur eine Möglichkeit, um Objekte zu erstellen. Wenn eine Funktion mit new aufgerufen wird, heißt das Konstruktoraufruf . Es ist eine der vier Möglichkeiten, wie Funktionen aufgerufen werden können. Die anderen drei sind der Vollständigkeit halber Methodenaufruf , Funktionsaufruf und Aufschaltung anwenden .

Wenn Sie eine Funktion als Konstruktor verwenden möchten, würden Sie dies per Konvention mit einem Großbuchstaben beginnen und dann mit dem Schlüsselwort new aufrufen. Dies erstellt ein leeres Objekt basierend auf Object.prototype und legt es gleich this fest. Wenn Sie diesen Modus der Objekterstellung verwenden, fügen Sie dem resultierenden Objekt Eigenschaften hinzu, indem Sie diese direkt zu this hinzufügen, dh this.foo = 12

Methoden dieses Objekts würden durch Ändern des Prototyps Ihrer Funktion hinzugefügt.

%Vor%

Beachten Sie, dass die Verwendung von Konstruktoren mit vielen Schwierigkeiten verbunden ist, insbesondere wenn Sie die Vererbung implementieren möchten

Objekte können einfacher erstellt werden, indem sie von einer "normalen" Funktion zurückgegeben werden:

%Vor%

Dies erleichtert auch das Verbergen von Informationen:

%Vor%

(Sie können das Verbergen von Informationen auch mit Konstruktoren implementieren, aber geschützte Informationen werden für Methoden, die Sie auf den Prototyp setzen, nicht sichtbar. Geschützte Informationen sind nur für Methoden sichtbar, die Sie manuell zu this hinzufügen. )

Der einzige Nachteil hierbei ist, dass die Erstellung etwas langsamer wird, da jedes Mal die someFunc Methode de novo erstellt wird; mit einem Konstruktor würde es einmal als Teil des Prototyps existieren.

4. Was ist vorzuziehen? Wenn Sie nur ein einzelnes Objekt erstellen möchten, verwenden Sie 3 oder 4. Einfach.

Wenn Sie ein Objekt wiederholt erstellen möchten, ist abhängig davon . Werden Sie Zehntausende dieser Objekte schaffen, so dass Geschwindigkeit von größter Bedeutung ist? Wenn das so ist, wirst du wahrscheinlich einen Konstruktor haben wollen. Wenn nicht, dann kommt es darauf an, mit was Sie am wohlsten sind. Ich finde eine einfache Funktion, die ein Objekt am klarsten und am flexibelsten zurückgibt, aber das ist nur meine Vorliebe. Viele Entwickler, die viel schlauer sind als ich, bevorzugen Konstrukteure.

    
Adam Rackis 28.11.2011, 23:19
quelle
1
  1. 3 und 4 sind immer noch Funktionen, aber sie sind auch Objekte. 1 und 2 sind auch Objekte und Funktionen. Alle Funktionen sind Objekte - JavaScript hat erstklassige Funktionen.

  2. Es instanziiert ein Objekt. Die Funktionen, die mit new aufgerufen werden, sind Konstruktoren . Sie erstellen Objekte.

  3. Sie sind genau dasselbe. Wie in # 1 hat die Verschachtelungsebene keine Auswirkungen auf den Typ von irgendetwas ...

  4. Nein, weil sie alle gleichwertig sind. A Function ist ein Object und es ist egal wo es ist. Im Allgemeinen vermeiden Sie jedoch eine starke Verschachtelung für Namespaces, da dies Ihren Code verlangsamen kann, ohne dass Sie sich so viel Klarheit verschaffen. JavaScript wurde nicht wirklich mit Namespaces entworfen.

Ryan 28.11.2011 23:19
quelle
0

AFAIK

1) In JS sind alle Funktionen Objekte. Im Fall von 3, ja würde es als ein Objekt betrachtet werden, weil es in geschweiften Klammern

ist

3) Sie sind die gleiche Sache, aber eine Möglichkeit, wie Sie Dinge auffrischen könnten, wäre eine der höchsten Eigenschaften und nicht die andere, die die nicht zurückgegebene Funktion im Wesentlichen verbergen und Ihnen einen Weg zum Erstellen geben öffentliche und private Methoden.

4) Wahrscheinlich ist 4 dem, was ich denke, am nächsten und folgt einigen vernünftigen Ansätzen, aber wie Andrew sagt, würde ich geneigt sein, 4 in etwas wie das zu verwandeln:

%Vor%

Beachten Sie die Klammer am Ende der Methode und erzwingen Sie, dass die Funktion sofort ausgeführt wird und sich vor der Laufzeit für den Rest der App verfügbar macht (in Bezug auf z. B. intellisense)

BEARBEITEN:

So würde ich "private" Funktionen als Antwort auf den Kommentar "Warum würdest du das machen" verwenden:

%Vor%     
dougajmcdonald 28.11.2011 23:25
quelle

Tags und Links