2

我的 javascript 如下所示。我不明白为什么这些方法都是公开的?

Something.RegisterNamespace("One.ABC");

    (function(ABC) {

      ABC.SayHello = function() {
             alert('hello');

      };

    })(One.ABC);

所以现在我可以这样做:

One.ABC.SayHello();
4

6 回答 6

2

拥有私有方法的唯一有效方法是使用闭包。

function MyClass() {
    var privateMethod = function() {
        return 0;
    };

    this.publicMethod = function() {
        return privateMethod();
    };
}
于 2010-05-10T18:12:29.233 回答
1

您正在将SayHello函数添加到传入的对象中,即One.ABC. 你还期待什么?如果您想要一个私有函数,请在您的匿名函数 ( var SayHello = function(){...}) 中定义它,而不将其添加到对象中。不确定您要完成什么...

编辑

以下是我将如何重写您的代码以执行我认为您想要的操作:

One = {};
One.ABC = {};

(function(ABC) {
    var PrivateHello = function(){
        alert('hello');
    };
    ABC.PublicHello = function() {
        PrivateHello();
    };
})(One.ABC);

One.ABC.PublicHello(); // alerts 'hello'
One.ABC.PrivateHello(); // error 'One.ABC.PrivateHello is not a function'
于 2010-05-10T18:10:43.590 回答
1

你的代码也可以写成:

var One = {
      ABC:{
       SayHello: function() {
         alert('hello');
       }
      }
};
One.ABC.SayHello(); //=> hello

这个变量定义创建了一个(伪)命名空间One(实际上是全局命名空间中的一个对象)。的第一个属性OneABCABC也是一个对象,并且有一个属性,公共方法SayHello。如果您想SayHello保持私密,这可能是一种方法:

var Two = {
    ABC: ( function(){
        // SayHello is a private function within this
        // anonymous function 
        // it can only be accessed by a public method 
        // you create (here it's the method Hi)
        function SayHello() {
          alert('hello from Two.ABC');
        }
        return {
                SayHello: function(){alert('you are not allowed to say Hello!');},
                Hi: SayHello
               };
        } )()
    }
    Two.ABC.SayHello(); //=> you are not allowed to say Hello!
    Two.ABC.Hi(); //=> hello from Two.ABC

NowTwo.ABC也是一个对象,但它是使用在创建时实例化的匿名构造函数创建的(我认为它被称为单例模式)。在该构造函数SayHello中现在是一个私有(不可公开访问)函数。您必须分配一些公共方法来访问SayHello(此处:)Two.ABC.Hi,否则它将被完全隐藏。在此示例中,由于SayHello在匿名函数范围内定义,因此匿名函数返回的方法可以访问它,而父范围(ABC 和 Two)又可以访问这些方法。换句话说,该函数被单例返回的方法所SayHello包围

于 2010-05-10T21:02:19.367 回答
0

我希望函数的名称和命名空间的名称相同,所以可以将它们称为公共

于 2010-05-10T18:10:29.003 回答
0

RegisterNamespace 不是标准的 JS。但这看起来像是在创建一个具有“ABC”属性的对象“One”

匿名函数通过属性“ABC”将其内部函数绑定到对象“One”

所以你最终得到:

var One = {"ABC" : { "SayHello" : function(){alert('hello')}}}
于 2010-05-10T18:14:06.940 回答
0

对象的所有属性/对象都是公共的。您发布的代码示例相当于

Something.RegisterNamespace("One.ABC");
One.ABC.SayHello = function() { alert('hello'); };

在这里,您将属性定义为SayHello在调用时执行警报语句的函数。

编辑:也许你被代码的结构抛弃了?本节

(function(ABC) {
  ABC.SayHello = function() {
         alert('hello');

  };

})(One.ABC);

相当于

function addHello(pObject) {
    pObject.SayHello = function() {
        alert('hello');
    };
}

addHello(One.ABC);

唯一的区别是,在您的示例中,该函数是内联定义的,然后立即运行。

(...)(parameters);

内联定义它只是使函数可用于一次性使用,在我的示例中,您可以使用相同的函数SayHello为许多对象定义方法。

于 2010-05-10T18:19:20.700 回答