Вопрос по javascript – Правильно ли думать о выражении функции Javascript, которое использует ключевое слово «new» как «статический»

22

Я просто пытаюсь понять Javascript немного глубже.

Я создал «класс»gameData что я хочу только ОДИН из, не нуждается в конструкторе или создан.

Итак, я создал это так ...

<code>var gameData = new function () {

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

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

Понимая, что «новый» Ключевое слово не позволяет создавать его экземпляры и делает его доступным, КАК статический класс был бы в C #.

Я правильно об этом думаю? Как статично?

Если вам нужен только один экземпляр объекта, зачем вообще использовать конструктор? RobG
Связанные с :stackoverflow.com/questions/17008086/… Benjamin Gruenbaum
смотрите такжеnew function() with lower case “f” in JavaScript Bergi
Не уверен, что понимаю ваш вопрос. Я создал его таким образом, в отличие от литерала базового объекта, чтобы у меня были личные и публичные свойства и методы. Todd Vance

Ваш Ответ

3   ответа
26

constructor свойство, указывающее на ваш & quot; анонимный & quot; функция. В вашем примере вы могли бы использовать

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

восстановить экземпляр второго объекта, так что «класс» (экземпляр на самом деле) на самом деле не является «статичным». Вы в основномleaking конструктор и, возможно, данные, связанные с ним. Такжеuseless прототип объекта (gameData.constructor.prototype) создается и вставляется в цепочку прототиповgameDataчто не то, что вы хотите.

Вместо этого вы можете использовать

a single, simple object literal (as in Daff's answer). That means you don't have a constructor, no closure-scoped private variables (you have used none anyway) and no (custom) prototype. the (revealing) module pattern (as in jAndy's answer). There you'd have an IIFE to create closure-scoped variables, and can return any kind of object. an actual constructor ("class") that can be instantiated later (when needed), and yields the same singleton object always.

Вот как будет выглядеть шаблон синглтона:

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

Тем не менее, прототип совершенно бесполезен, потому что у вас есть только один экземплярGameData, Было бы интересно только с наследством.

6

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

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

Если вы хотите использовать закрытые переменные, создайте раскрывающуюся оболочку стиля шаблона модуля Это в основном то, что предложил Джэнди:

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;
            }
        }
    }
})();
Error: User Rate Limit Exceeded Todd Vance
Error: User Rate Limit Exceeded
13

Class в ECMAscript есть толькоObject.

когдаnew используется для вызова функции, мы называем ееconstructor function, Эта функция несколько автоматически возвращает новый объект после его завершения. Любые данные, которые хранятся в этом объекте с использованиемthis (который ссылается на этот вновь созданный объект) возвращается как свойство этого объекта. Кроме того,new устанавливает свойство под названиемconstructor именно к этой функции.

В вашем случае вы даже не требуете использованияnewВы можете легко переписать свой код следующим образом:

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;
}());

Это называетсяfactory pattern, singleton pattern, module patternи могут быть некоторые другие имена.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededdeveloper.mozilla.org/en/docs/Web/JavaScript/Reference/Classes
Error: User Rate Limit Exceeded Todd Vance
There is no Class in ECMAscriptError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы