【问题标题】:How do I create a static member for an object in a namespace in JavaScript?如何在 JavaScript 命名空间中为对象创建静态成员?
【发布时间】:2012-10-14 17:03:38
【问题描述】:

我已经在 J​​avascript 中模拟了一个静态类变量。

MyObject.staticVariable = "hello world";

function MyObject() {
    // do something
}

MyObject.prototype.someFunction = function() ...

我不明白为什么这种语法有效,因为在分配 staticVariable 属性之前我没有显式创建 MyObject(我怎么可能仍然有一个 MyObject 函数?)。但它确实有效,我在许多问题的答案中都看到了它:如何在 Javascript 中模拟静态类变量?

当我在命名空间中声明 MyObject 函数时,如何实现此功能?

var Namespace = {};

// Not allowed, and for good reason in my eyes, as NameSpace.MyObject does not exist
Namespace.MyObject.staticVariable = "hello world";

Namespace.MyObject = function() {
    // do something
}

Namespace.MyObject.prototype.someFunction = function() ...

如果我可以澄清和/或我的想法是否错误,请告诉我。谢谢。

【问题讨论】:

    标签: javascript namespaces static-members oop


    【解决方案1】:

    你能澄清一下你所说的静态类变量是什么意思吗? JavaScript 与 Java 不同。

    如果你想要一个客户端不能修改的常量,你可以使用闭包。 例如:

    var Namespace = {};
    Namespace.MyObject = (function(){
      var staticVariable = "hello world";
    
      //this will be assigned to "MyObject"
      return {
        someFunction: function() {
           //refer to staticVariable here
           //no client can modify staticVariable directly; 
           //only through the methods you provide
        }
      };
    })();
    

    【讨论】:

    • 谢谢。这提供了比我需要的更多的信息,但我认为这是有用的信息。我真的没有特别想到任何参考语言,我的意思是用对象替换类。我还不担心保护我的对象内部,这有点超出我为什么有人会在 JavaScript 中这样做,但我们会看看我的想法是如何演变的。
    【解决方案2】:

    函数声明被提升,也就是说,您可以在它们的实例化之上使用它们。但是,函数 表达式 不是。在您的示例中,您可以这样做:

    Namespace.MyObject.staticVariable = "hello world";
    
    Namespace.MyObject = function() {
        // do something
    }
    

    这不起作用,因为Namespace.MyObject 没有(也不能)创建为函数声明。至于模拟功能,使用函数:

    function add( prop, val ) {
        Namespace.MyObject[ prop ] = val;
    }
    

    这将允许您在显式创建对象之前向对象添加属性:

    add( "staticVariable", "Hello World" );
    
    Namespace.MyObject = function() {
        // do something
    };
    

    【讨论】:

      【解决方案3】:

      函数声明被“提升”到当前词法环境的顶部。

      这意味着该函数在该环境中的任何其他代码运行之前就存在。

      // This works
      
      MyObject.staticVariable = "hello world";
      
      function MyObject() {
          // do something
      }
      

      // This does not
      
      MyObject.staticVariable = "hello world";
      
      var MyObject = function() {
          // do something
      }
      

      在您的Namespace 示例中,它实际上与第二个示例相同。这意味着您需要确保函数分配首先发生。

      【讨论】:

        猜你喜欢
        • 2013-06-28
        • 1970-01-01
        • 1970-01-01
        • 2013-03-10
        • 2012-05-27
        • 1970-01-01
        • 1970-01-01
        • 2012-06-16
        • 2014-04-25
        相关资源
        最近更新 更多