2010-05-10 63 views
2

我的JavaScript看起來如下所示。我不明白爲什麼這些方法都是公開的?爲什麼這些方法是公開的?

Something.RegisterNamespace("One.ABC"); 

    (function(ABC) { 

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

     }; 

    })(One.ABC); 

所以,現在我可以這樣做:

One.ABC.SayHello(); 

回答

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' 
+0

我想我不完全掌握關閉然後:( – Blankman 2010-05-10 18:18:35

+0

如果你真的想學習閉包(和JS一般)幫你一個忙,並拿起大衛弗拉納根的書:http://www.amazon.com/ JavaScript的權威導向激活-頁/ DP/0596805527 / – 2010-05-10 23:34:21

0

我希望函數名和名稱空間的名字是一樣的,所以那些可以被稱爲公共

2

的唯一有效方法有私人方法是通過使用閉包。

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

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

RegisterNamespace不是標準的JS。但是,這看起來是創建一個對象「一」與「ABC」

匿名函數是其內在的功能綁定到對象「一」通過屬性「ABC」

所以,你最終的屬性與:

var One = {"ABC" : { "SayHello" : function(){alert('hello')}}} 
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方法的功能。

1

爲您的代碼也可以寫成:

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

這個變量定義創建一個(僞)命名空間One(實際上,在全局命名空間的對象)。 One的第一個財產是ABCABC也是一個對象,並且有一個屬性,公共方法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封閉通過單身人士返回的方法。

相關問題