1

我在 Javascript 中模拟了一个静态类变量。

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() ...

让我知道我是否可以澄清和/或我的想法是否错误。谢谢。

4

3 回答 3

4

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

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

// This works

MyObject.staticVariable = "hello world";

function MyObject() {
    // do something
}

// This does not

MyObject.staticVariable = "hello world";

var MyObject = function() {
    // do something
}

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

于 2012-10-24T15:56:14.983 回答
0

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

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
};
于 2012-10-24T15:57:55.743 回答
0

您能否阐明静态类变量的含义?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
    }
  };
})();
于 2012-10-24T16:02:25.157 回答