我的 javascript 如下所示。我不明白为什么这些方法都是公开的?
Something.RegisterNamespace("One.ABC");
(function(ABC) {
ABC.SayHello = function() {
alert('hello');
};
})(One.ABC);
所以现在我可以这样做:
One.ABC.SayHello();
我的 javascript 如下所示。我不明白为什么这些方法都是公开的?
Something.RegisterNamespace("One.ABC");
(function(ABC) {
ABC.SayHello = function() {
alert('hello');
};
})(One.ABC);
所以现在我可以这样做:
One.ABC.SayHello();
拥有私有方法的唯一有效方法是使用闭包。
function MyClass() {
var privateMethod = function() {
return 0;
};
this.publicMethod = function() {
return privateMethod();
};
}
您正在将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'
你的代码也可以写成:
var One = {
ABC:{
SayHello: function() {
alert('hello');
}
}
};
One.ABC.SayHello(); //=> hello
这个变量定义创建了一个(伪)命名空间One
(实际上是全局命名空间中的一个对象)。的第一个属性One
是ABC
。ABC
也是一个对象,并且有一个属性,公共方法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
包围。
我希望函数的名称和命名空间的名称相同,所以可以将它们称为公共
RegisterNamespace 不是标准的 JS。但这看起来像是在创建一个具有“ABC”属性的对象“One”
匿名函数通过属性“ABC”将其内部函数绑定到对象“One”
所以你最终得到:
var One = {"ABC" : { "SayHello" : function(){alert('hello')}}}
对象的所有属性/对象都是公共的。您发布的代码示例相当于
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
为许多对象定义方法。