我的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();
您添加的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'
我希望函數名和名稱空間的名字是一樣的,所以那些可以被稱爲公共
的唯一有效方法有私人方法是通過使用閉包。
function MyClass() {
var privateMethod = function() {
return 0;
};
this.publicMethod = function() {
return privateMethod();
};
}
RegisterNamespace不是標準的JS。但是,這看起來是創建一個對象「一」與「ABC」
匿名函數是其內在的功能綁定到對象「一」通過屬性「ABC」
所以,你最終的屬性與:
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
方法的功能。
爲您的代碼也可以寫成:
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
現在Two.ABC
是一個對象太多,但它是用實例上創建一個匿名構造函數(Singleton模式,我認爲創建它被稱爲)。在那個構造函數SayHello
現在是一個私有的(不公開的)函數。你必須指定一些公開的方法來訪問SayHello
(這裏:Two.ABC.Hi
),否則它將被完全隱藏。在此示例中,因爲SayHello
在匿名函數作用域內定義,所以匿名函數返回的方法可以訪問它,而父級作用域(ABC和TWo)則可以訪問這些方法。換句話說,功能SayHello
是封閉通過單身人士返回的方法。
我想我不完全掌握關閉然後:( – Blankman 2010-05-10 18:18:35
如果你真的想學習閉包(和JS一般)幫你一個忙,並拿起大衛弗拉納根的書:http://www.amazon.com/ JavaScript的權威導向激活-頁/ DP/0596805527 / – 2010-05-10 23:34:21