Javascript – Speicherfunktion im Objekt – schlechte Praxis? [closed]

Lesezeit: 4 Minuten

Benutzer-Avatar
Zar

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

In Betracht ziehen:

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 bekommen, wird es chaotisch. Ich finde es zum Beispiel viel, viel sauberer zu verwenden Game.update() statt updateGame(); oder ähnliches. Wenn man tiefer kommt, wie Game.notify.admin(id) und so weiter, es gibt Ihnen noch schöneren Code.

Gibt es Nachteile durch das Speichern einer Funktion in einem Objekt?

  • Nein. Wenn es das gäbe, würden Frameworks mit Millionen von Nutzern weltweit das nicht tun.

    – Jon

    17. Januar 2012 um 22:39 Uhr

  • Nein. Das ist ein Standard-Namensraum, um eine globale Verschmutzung zu vermeiden, wie Ihre Frage bereits erwähnt hat. Warum sollte es schlecht sein?

    Benutzer1106925

    17. Januar 2012 um 22:39 Uhr

Der erste Ansatz wird bevorzugt. Auf diese Weise definieren Sie explizit den Umfang Ihrer Funktionen, anstatt den globalen Umfang 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 90er Jahren, lassen wir es in Ruhe in der Vergangenheit ruhen und verwenden Sie das richtige Scoping.

  • Aggressives Verschachteln hat einige Nachteile. Putten Funktionen bei Objekten “weil es besser ist” zum Beispiel ist dumm. (Funktionen in den globalen Geltungsbereich zu setzen ist auch dumm, aber das war nicht das, womit wir es zu tun hatten, nehmen Sie den Modulbereich an). Auch das Verschachteln von Objekten und Funktionen über 4 Ebenen hinaus wird albern. Idealerweise möchten Sie eine oder zwei Ebenen für Ihre Objekt-/Methodenkette foo.bar.baz()

    – Raynos

    17. Januar 2012 um 23:12 Uhr

  • Geht es wirklich um Reichweite? Oder geht es nur darum, die Anzahl der globalen Variablen zu reduzieren, um die Wahrscheinlichkeit doppelter Variablennamen zu verringern. Hat “globale Umweltverschmutzung”. irgendein andere nachteilige Nebenwirkung?

    – RobG

    18. Januar 2012 um 0:08 Uhr

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

    – Raynos

    18. Januar 2012 um 16:50 Uhr

  • @RobG es geht nicht um Konflikte, es geht darum sicherzustellen, dass der Code nicht versehentlich Invarianten brechen kann, indem er den globalen Zustand beschädigt. In großen Projekten möchten Sie einfach keinen globalen Zustand, anstatt sich auf die Konvention zu verlassen, dass der globale Zustand nicht beschädigt ist.

    – Raynos

    18. Januar 2012 um 22:54 Uhr

  • @PhilOlson – das einfache Speichern von Werten in einem Objekt hat keine Vorteile gegenüber der Verwendung von Variablen. Wenn Modularität erwünscht ist (und Modularität eine gute Idee ist), dann gibt es das Modulmuster, das nur die Eigenschaften offenlegt, die offengelegt werden müssen, und den Rest in einem separaten Ausführungskontext verbirgt.

    – RobG

    1. Dezember 2014 um 12:50 Uhr

Benutzer-Avatar
Karl Mendes

In diesem speziellen Fall gehen Sie mit dem ersten. Aber wenn Ihr Foo-Objekt wirklich komplex wird, möchten Sie vielleicht einen anderen Ansatz verwenden, der Ihnen die Möglichkeit gibt, einen Konstruktor zu verwenden. 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 verwenden Sie den Prototyp, danke.

    – Raynos

    17. Januar 2012 um 23:12 Uhr

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

    – Karl Mendes

    18. Januar 2012 um 9:07 Uhr

Benutzer-Avatar
RobG

Namespace-Objekte sind keine Zauberei, und Sie werden auch keine 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 reduzieren. Ein zweiter Grund besteht darin, ähnliche Funktionen der Einfachheit halber zu gruppieren, z. B.:

// 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 Obige praktisch die gleiche Wahrscheinlichkeit von Duplikaten hat wie ähnlich globale Variablen:

// Global variable example:
myLib_dom_someDOMFunction0;
myLib_dom_someDOMFunction1;

myLib_util_someUtilityFunction0;
myLib_util_someUtilityFunction1;

Natürlich wird Ersteres im Allgemeinen bevorzugt, da es als einfacher zu handhaben angesehen wird. Ich plädiere nicht dafür, dass Sie den zweiten Ansatz übernehmen (ich verwende den ersten), sondern weise nur darauf hin, dass es zwar ein Problem mit der Erstellung vieler globaler Variablen gibt, die sogenannte “globale Namespace-Verschmutzung” jedoch als Gefahr stark überschätzt wird.

1099180cookie-checkJavascript – Speicherfunktion im Objekt – schlechte Praxis? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy