当前位置: 首页 > 面试题库 >

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

陶柏
2023-03-14
问题内容

我只是想更深入地了解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)();

重新实例化第二个对象,因此“类”(实际上是实例)并不是真正的“静态”。基本上,您正在 泄漏 构造函数,可能 还会泄漏
与其绑定的数据。另外,确实会创建一个 无用的
原型对象(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。继承只会变得有趣。



 类似资料:
  • 问题内容: 在另一个问题中,用户指出该关键字使用很危险,并提出了不使用该对象创建对象的解决方案。我不相信这是真的,主要是因为我使用了Prototype,Scriptaculous和其他出色的JavaScript库,并且每个人都使用了关键字。 尽管如此,昨天我还是在DouglasCrockford在YUI剧院观看了一次演讲,他说的一模一样,他不再在代码中使用关键字(JavaScript上的Crock

  • 我在java中有以下正则表达式- 但这仍然匹配“”。 整个代码-

  • 问题内容: 我正在查看Drupal 7的资源,发现了一些以前从未见过的东西。我在php手册中做了一些初步的了解,但没有解释这些示例。 关键字对函数内部的变量有什么作用? 问题答案: 它使函数记住多次调用之间给定变量的值(在您的示例中)。 您可以将其用于不同的目的,例如: 在此示例中,只能执行一次。即使会发生多次呼叫。

  • 本文向大家介绍iOS static 关键字的作用?相关面试题,主要包含被问及iOS static 关键字的作用?时的应答技巧和注意事项,需要的朋友参考一下 (1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值; (2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; (

  • 问题内容: 在JavaScript中的关键字可能会相当混乱首次遇到它的时候,人们往往会认为JavaScript是不是面向对象的编程语言。 它是什么? 它解决什么问题? 什么时候合适,什么时候不合适? 问题答案: 它做五件事: 它创建一个新对象。这个对象的类型就是 object 。 它将这个新对象的内部不可访问的 [[prototype]] (即 proto )属性设置为构造函数的外部可访问 原型

  • 问题内容: 我在RosettaCode上找到了以下Java代码示例: 我不是特别了解Java,但除了正则表达式本身以外,都了解此代码段的所有方面 当您在内置PHP函数中找到它时,我对Regex有了基本的了解。 素数如何匹配? 问题答案: 您说您了解这部分,但仅强调一下,生成的字符串的长度等于提供的数字。因此,当且仅当字符串包含三个字符。 正则表达式的第一部分说:“任何字符,零次或一次”。因此,基本