Javascript - Funktion im Objekt speichern - schlechte Praxis? [geschlossen]


73

Wird es als schlechte Codierungspraxis angesehen, Funktionen in einem Objekt zu speichern, anstatt sie nur zu definieren (und daher global)?

Erwägen:

1.

Foo = {
    bar: function() {
        alert("baz");
    }   
}

Foo.bar();

vs.

2.

function bar() {
    alert("baz");
}

bar();

Sicher, es könnte etwas weniger Code für das zweite Beispiel sein, aber wenn Sie anfangen, viele Funktionen zu erhalten, wird es chaotisch. Ich finde es viel, viel, sauberer, zum Beispiel zu verwenden, Game.update()anstatt updateGame () zu verwenden; oder ähnliches. Wenn Sie tiefer gehen, wie Game.notify.admin(id)und so weiter, erhalten Sie noch schöneren Code.

Gibt es Nachteile beim Speichern einer Funktion in einem Objekt?


2
Nein. Wenn dies der Fall wäre, würden Frameworks mit Millionen von Benutzern weltweit dies nicht tun.
Jon

2
Nein. Dies ist ein Standard-Namespace, um globale Verschmutzung zu vermeiden, wie Ihre Frage bereits dargelegt hat. Warum sollte es schlecht sein?

Antworten:


75

Der erste Ansatz ist bevorzugt. Auf diese Weise definieren Sie den Umfang Ihrer Funktionen explizit, anstatt den globalen Bereich zu verschmutzen. Es gibt keine Nachteile bei der Verwendung des ersten Ansatzes. Nur Vorteile :-)

Fazit: Verwenden Sie immer den ersten Ansatz, um Funktionen zu definieren. Das zweite ist wie Javascript in den 90ern. Lassen wir es in Ruhe in der Vergangenheit ruhen und verwenden Sie das richtige Scoping.


3
Aggressives Verschachteln hat einige Nachteile. Das Setzen von Funktionen auf Objekte, "weil es besser ist", ist zum Beispiel dumm. (Das Einfügen von Funktionen in den globalen Bereich ist ebenfalls dumm, aber das war nicht das, womit es zu tun hatte. Nehmen Sie den Modulbereich an.) Auch das Verschachteln von Objekten und Funktionen über 4 Ebenen hinaus wird albern. foo.bar.baz()
Idealerweise

2
Geht es wirklich um Umfang? Oder es geht nur darum, die Anzahl der globalen Variablen zu reduzieren, um die Wahrscheinlichkeit doppelter Variablennamen zu verringern. Hat „globale Verschmutzung“ hat jede andere negative Nebenwirkung?
RobG

@ RobG Wartbarkeit. Es gibt viele gute Gründe, die Anzahl der globalen Variablen auf Null zu reduzieren.
Raynos

1
@RobG Es geht nicht um Konflikte, es geht darum sicherzustellen, dass Code nicht versehentlich Invarianten durch Beschädigung des globalen Zustands brechen kann. In großen Projekten möchten Sie einfach keinen globalen Status, anstatt sich auf die Konvention zu verlassen, dass der globale Status nicht beschädigt wird.
Raynos

2
@ PhilOlson - Das einfache Speichern von Werten in einem Objekt hat keine Vorteile gegenüber der Verwendung von Variablen. Wenn Modularität gewünscht wird (und Modularität eine gute Idee ist), gibt es das Modulmuster, das nur die Eigenschaften verfügbar macht, die verfügbar gemacht werden müssen, und den Rest in einem separaten Ausführungskontext verbirgt.
RobG

4

In diesem speziellen Fall gehen Sie mit dem ersten. Wenn Ihr Foo-Objekt jedoch sehr komplex wird, möchten Sie möglicherweise einen anderen Ansatz verwenden, mit dem Sie einen Konstruktor verwenden können. Und auch der erste Ansatz ist manchmal nicht der beste, wenn es um den Funktionsumfang geht:

function Foo(appName){
    this.name = appName;      
}

Foo.prototype.Bar = function(){
   alert(this.name)
}

var a = new Foo("baz");
a.Bar();

Anti-Muster erkannt. Bitte benutzen Sie den Prototyp, danke.
Raynos

Sie haben Recht @Raynos, das Problem beim Deklarieren von Funktionen innerhalb einer Funktion besteht darin, dass sie jedes Mal neu erstellt werden, wenn Sie die Klasse initiieren.
Karl Mendes

4

Es gibt keine Magie mit Namespace-Objekten, und Sie werden auch nicht unbedingt Probleme haben, wenn Sie viele globale Variablen verwenden. Der Hauptgrund für die Verwendung von "Namespace" -Objekten besteht darin, das Potenzial für doppelte globale Variablennamen zu verringern. Ein zweiter Grund besteht darin, ähnliche Funktionen der Einfachheit halber zu gruppieren, z.

// Object example (suggested best practice):
// DOM functions are under myLib.dom
myLib.dom.someDOMFunction0;
myLib.dom.someDOMFunction1;

// Utility functions are under myLib.util
myLib.util.someUtilityFunction0;
myLib.util.someUtilityFunction1;

Beachten Sie, dass das oben Genannte praktisch die gleiche Wahrscheinlichkeit für Duplikate aufweist wie ähnlich globale Variablen:

// Global variable example:
myLib_dom_someDOMFunction0;
myLib_dom_someDOMFunction1;

myLib_util_someUtilityFunction0;
myLib_util_someUtilityFunction1;

Ersteres wird natürlich im Allgemeinen bevorzugt, da es als einfacher zu handhaben angesehen wird. Ich befürworte nicht, dass Sie den zweiten Ansatz wählen (ich verwende den ersten), sondern nur darauf hinweisen, dass die sogenannte "globale Verschmutzung des Namespace" als Gefahr stark überbewertet wird, obwohl es ein Problem bei der Erstellung vieler globaler Variablen gibt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.