我的javascript如下所示。我不明白为什么这些方法都是公开的?
Something.RegisterNamespace("One.ABC");
(function(ABC) {
ABC.SayHello = function() {
alert('hello');
};
})(One.ABC);
现在我可以做到:
One.ABC.SayHello();
答案 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
的第一个属性是ABC
。 ABC
也是一个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
方法。