Ist es richtig, sich einen Javascript-Funktionsausdruck vorzustellen, der das Schlüsselwort „new“ als „statisch“ verwendet?

Lesezeit: 4 Minuten

Ist es richtig sich einen Javascript Funktionsausdruck vorzustellen der das Schlusselwort
Todd Vance

Ich versuche nur, Javascript ein wenig tiefer zu verstehen.

Ich habe eine “Klasse” erstellt gameData dass ich nur EINS möchte, keinen Konstruktor benötigt oder instanziiert wird.

Also habe ich es so erstellt …

var gameData = new function () {

    //May need this later 
    this.init = function () { 
    };

    this.storageAvailable = function () {
        if (typeof (Storage) !== "undefined") {
            return true;
        }
        else {
            return false;
        }
    };
}

Erkennen, dass das Schlüsselwort „new“ keine Instanziierung zulässt und es verfügbar macht, WIE eine statische Klasse in C# wäre.

Denke ich das richtig? Als statisch?

  • Wenn Sie nur eine einzelne Instanz eines Objekts benötigen, warum überhaupt einen Konstruktor verwenden?

    – RobG

    2. Mai 2012 um 1:29 Uhr

  • Ich bin mir nicht sicher, ob ich Ihre Frage verstehe. Ich habe es auf diese Weise im Gegensatz zu einem einfachen Objektliteral erstellt, damit ich private und öffentliche Eigenschaften und Methoden haben kann.

    – Todd Vance

    2. Mai 2012 um 1:31 Uhr

  • Siehe auch: stackoverflow.com/questions/17008086/…

    – Benjamin Grünbaum

    8. April 2014 um 11:08 Uhr

  • siehe auch new function() mit Kleinbuchstaben „f“ in JavaScript

    – Bergi

    19. August 2014 um 11:29 Uhr

Ist es richtig sich einen Javascript Funktionsausdruck vorzustellen der das Schlusselwort
Bergi

Nein, es ist nicht statisch, weil es immer noch eine hat constructor -Eigenschaft, die auf Ihre “anonyme” Funktion verweist. In Ihrem Beispiel könnten Sie verwenden

var gameData2 = new (gameData.constructor)();

um ein zweites Objekt neu zu instanziieren, also ist die “Klasse” (eigentlich Instanz) nicht wirklich “statisch”. Sie sind im Grunde undicht der Konstruktor und möglicherweise die daran gebundenen Daten. Auch ein nutzlos Prototypobjekt (gameData.constructor.prototype) wird erstellt und in die Prototypkette von eingefügt gameDatadas ist nicht das, was Sie wollen.

Stattdessen könnten Sie verwenden

  • ein einzelnes, einfaches Objektliteral (wie in Daffs Antwort). Das bedeutet, dass Sie keinen Konstruktor, keine privaten Variablen mit Abschlussbereich (Sie haben sowieso keine verwendet) und keinen (benutzerdefinierten) Prototyp haben.
  • das (aufschlussreiche) Modulmuster (wie in jAndys Antwort). Dort hätten Sie ein IIFE zum Erstellen von Variablen mit Abschlussbereich und können jede Art von Objekt zurückgeben.
  • ein tatsächlicher Konstruktor (“Klasse”), der später (bei Bedarf) instanziiert werden kann und immer dasselbe Singleton-Objekt liefert.

So würde das Singleton-Muster aussehen:

function GameData() {
    if (this.constructor.singleton)
        return this.constructor.singleton;
    else
        this.constructor.singleton = this;

    // init:
    // * private vars
    // * public properties
    // ...
}
GameData.prototype.storageAvailable = function () {
    if (typeof (Storage) !== "undefined") {
        return true;
    }
    else {
        return false;
    }
};

var gameData = new GameData();
var gameData2 = new GameData();
gameData === gameData2 === GameData.singleton; // true

Der Prototyp ist jedoch ziemlich nutzlos, da Sie nur eine Instanz von haben GameData. Interessant wird es erst beim Erbe.

Ist es richtig sich einen Javascript Funktionsausdruck vorzustellen der das Schlusselwort
jAndy

Es gibt kein Klasse in ECMAscript gibt es nur Objekt.

Wann new wird verwendet, um eine Funktion aufzurufen, wir nennen sie a Konstruktorfunktion. Diese Funktion gibt automatisch ein neues Objekt zurück, sobald sie fertig ist. Alle Daten, die in diesem Objekt gespeichert sind, verwenden this (die auf dieses neu erstellte Objekt verweist) wird als Eigenschaft dieses Objekts zurückgegeben. Daneben, new setzt eine Eigenschaft namens Konstrukteur zu genau dieser Funktion.

In Ihrem Fall benötigen Sie nicht einmal wirklich die Verwendung von newkönnten Sie Ihren Code einfach wie folgt umschreiben:

var gameData = (function () {
    var public = { },
        private = { }; // any private data can get stored here

    //May need this later 
    public.init = function () { 
    };

    public.storageAvailable = function () {
        if (typeof (Storage) !== "undefined") {
            return true;
        }
        else {
            return false;
        }
    };

    return public;
}());

Dies nennt man die Fabrikmuster, Singleton-Muster, Modulmusterund es könnte noch einige andere Namen geben.

  • Sie sollten es eine “selbst aufgerufene anonyme Fabrik” nennen.

    – Bergi

    2. Mai 2012 um 1:34 Uhr

  • Danke! Das sieht sehr interessant aus.. und etwas MEHR für mich zum Ausprobieren und Verdauen! 🙂

    – Todd Vance

    2. Mai 2012 um 1:34 Uhr

  • @toddv: Ein sehr guter Rat und eine Empfehlung ist “JavaScript: The good parts” von Douglas Crockford, um in die ECMAscript-Vererbung einzusteigen, Objekte + Prototypen.

    – jAndy

    2. Mai 2012 um 1:41 Uhr

  • There is no Class in ECMAscript. Eigentlich gibt es das jetzt mit ES6.

    – Stijn de Witt

    25. September 2015 um 14:40 Uhr

  • Ist das nicht nur eine sauberere Syntax für dasselbe? – “Klassen sind eigentlich Funktionen” developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes

    – Tom

    23. Januar 2016 um 13:45 Uhr


1646629511 882 Ist es richtig sich einen Javascript Funktionsausdruck vorzustellen der das Schlusselwort
Daff

Ich denke, was Sie suchen, ist nur ein einfaches JavaScript-Objekt:

var gameData = {
    //May need this later 
    init : function () { 
    },

    storageAvailable : function () {
        if (typeof (Storage) !== "undefined") {
            return true;
        }
        else {
            return false;
        }
    }
}

Wenn Sie private Variablen verwenden möchten, erstellen Sie einen aufschlussreichen Modulmuster-Wrapper. Dies ist im Grunde das, was jAndy vorgeschlagen hat:

var gameData = (function() {
    var private="private variable";

    return {
        //May need this later 
        init : function () { 
        },

        storageAvailable : function () {
            if (typeof (Storage) !== "undefined") {
                return true;
            } else {
                return false;
            }
        }
    }
})();

  • Ich bin diesen Weg nicht gegangen, weil ich öffentliche und private Methoden und Konstruktoren haben wollte … und das kann nicht mit Objektliteralen erreicht werden … richtig?

    – Todd Vance

    2. Mai 2012 um 1:33 Uhr

  • Ich habe meine Antwort für private Variablen aktualisiert. Ich verstehe nicht, warum Sie einen Konstruktor für eine statische Klasse benötigen würden?

    – Daff

    2. Mai 2012 um 1:38 Uhr

963010cookie-checkIst es richtig, sich einen Javascript-Funktionsausdruck vorzustellen, der das Schlüsselwort „new“ als „statisch“ verwendet?

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

Privacy policy