为什么公开这些方法?

时间:2010-05-10 18:05:23

标签: javascript public-method

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

Something.RegisterNamespace("One.ABC");

    (function(ABC) {

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

      };

    })(One.ABC);

现在我可以做到:

One.ABC.SayHello();

6 个答案:

答案 0 :(得分:2)

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

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

    this.publicMethod = function() {
        return privateMethod();
    };
}

答案 1 :(得分: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'

答案 2 :(得分:1)

您的代码也可以写成:

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

此变量定义创建(伪)名称空间One(实际上,是全局名称空间中的Object)。 One的第一个属性是ABCABC也是一个Object,它有一个属性,即公共方法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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

匿名函数通过属性“ABC”

将其内部函数绑定到对象“One”

所以你最终得到:

var One = {"ABC" : { "SayHello" : function(){alert('hello')}}}

答案 5 :(得分:0)

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

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

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

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

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

  };

})(One.ABC);

相当于

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

addHello(One.ABC);

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

(...)(parameters);

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