我剛開始在爲Javascript,所以我在命名空間中的第一次嘗試最終看上去像這樣:的Javascript命名空間污染問題
var myNameSpace = {};
var myNameSpaceProto = myNameSpace.__proto__;
myNameSpaceProto.SomeFunc = function()
{
alert("SomeFunc()");
};
myNameSpaceProto.SomeObject = function()
{
alert("SomeObject constructor");
};
var instance = new myNameSpace.SomeObject();
我收集我可以跳過原型步驟,只需有myNameSpace.SomeFunc = function...
,因爲只有一個myNameSpace
對象實例,所以原型不保存任何東西。
問題1:這是正確的嗎?我想從幾個獨立的.js文件添加到命名空間,所以這種方式看起來很方便。
問題2:與上面的代碼段,我發現的命名空間的污染,這是由以下SomeObject
體所示的奇怪的副作用:
myNameSpaceProto.SomeObject = function()
{
// As expected NonexistantFunc is not a member of this and returns "undefined"
alert("typeof this.NonexistantFunc = " + typeof this.NonexistantFunc);
// Returns 'function'. How has SomeFunc made it to this.SomeFunc? It's supposed to be under myNameSpace.SomeFunc
alert("typeof this.SomeFunc = " + typeof this.SomeFunc);
// Turns out it's in the prototype's prototype. Why?
alert("this.__proto__.__proto__.SomeFunc = " + this.__proto__.__proto__.SomeFunc);
};
這是在Chrome 8和I可以測試不知道如何SomeObject
已成爲SomeFunc
成員。這似乎是我對原型有限知識的一個漏洞。有人可以解釋嗎?
謝謝,很好的答案:)我來自C++背景,人們說* *語言有陷阱... – AshleysBrain 2011-01-28 17:29:15