一尘不染

考虑使用'new'关键字作为'static'的Javascript函数表达式是否正确?

javascript

我只是想更深入地了解Javascript。

我创建了一个“类” gameData,只希望其中之一,不需要构造函数,也无需实例化。

所以我就这样创造了它…

var gameData = new function () {

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

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

意识到’new’关键字不允许实例化并使它像静态类一样可用,将使用C#。

我是否正确地考虑了这一点?为静态?


阅读 279

收藏
2020-04-25

共1个答案

一尘不染

不,它不是静态的,因为它仍然具有constructor指向您的“匿名”函数的属性。在您的示例中,您可以使用

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

重新实例化第二个对象,因此“类”(实际上是实例)并不是真正的“静态”。基本上,您正在 泄漏 构造函数,可能 还会泄漏
与其绑定的数据。另外,确实会创建一个 无用的
原型对象(gameData.constructor.prototype),并将其插入的原型链中gameData,这不是您想要的。

相反,您可以使用

  • 一个简单的对象文字)。这意味着您没有构造函数,没有闭包范围的私有变量(无论如何都没有使用过),也没有(自定义)原型。
  • (显示)模块模式。在那里,您将具有IIFE来创建闭合范围的变量,并且可以返回任何类型的对象。
  • 一个实际的构造函数(“类”),可以稍后(在需要时)实例化,并始终产生相同的单例对象。

这是单例模式的样子:

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。继承只会变得有趣。

2020-04-25