gpt4 book ai didi

javascript - 将使用 'new' 关键字的 Javascript 函数表达式视为 'static' 是否正确

转载 作者:行者123 更新时间:2023-12-03 00:44:46 25 4
gpt4 key购买 nike

我只是想更深入地了解 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# 中的静态类一样可用。

我的想法正确吗?作为静态?

最佳答案

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

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

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

相反,您可以使用

  • 单个简单的对象文字(如 Daff's answer )。这意味着您没有构造函数,没有闭包范围的私有(private)变量(无论如何您都没有使用过),也没有(自定义)原型(prototype)。
  • (揭示的)模块模式(如 jAndy's answer )。在那里你会得到一个 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

然而,该原型(prototype)毫无用处,因为您只有一个 GameData 实例。只有继承才会变得有趣。

关于javascript - 将使用 'new' 关键字的 Javascript 函数表达式视为 'static' 是否正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10406552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com