2011-12-28 57 views
2

我想知道是否有方法將名稱空間保留在Javascript對象中的函數內。將名稱空間保留在對象函數範圍內

首先,讓我們設置一些東西。假設我們在名稱空間FooBar中有一個類(好,接近一個類獲得的類)Foo。然後在全局命名空間(窗口),我們有一流的酒吧,實例化美孚的,所以...

FooBar.Foo = function() { 

} 

function Bar() { 
    this.init(); 
} 

Bar.prototype = { 
    init: function() { 
    this.foo = new FooBar.Foo(); 
    } 
} 

目前我有兩個系統把東西放進範圍: 1.使用(「FooBar的」 )和unusing(「FooBar」)這些函數將引用移動到全局名稱空間內外的給定名稱空間的內容。 2. with(namespace(「FooBar」)){}這使用普通的行爲,給它一個對象包含對名稱空間中包含的所有內容的引用。 所以現在,我必須在每個函數中使用這些方法之一來將名稱空間帶入範圍。我想看看是否有類被聲明時定義這些並讓他們仍然在範圍只是這個班因某種封閉的方法...

FooBar.Foo = function() { 

} 

using("FooBar"); 

function Bar() { 
    this.init(); 
} 

Bar.prototype = { 
    init: function() { 
    this.foo = new Foo(); 
    } 
} 

unusing("FooBar"); 

所以,是的,是甚至可能這樣的事情,還是我堅持把這些事情經常納入範圍?

回答

1

這是一種可怕的。我會建議使用像RequireJS這樣的現代模塊系統。 My friend put together a nice presentation on the evolution and use of module systems in JavaScript。他們是JS對命名空間的回答。

您的代碼將是這個樣子:

// FooBar.js 
define(function (require, exports, module) { 
    exports.Foo = function() { }; 
}); 

// Bar.js 
define(function (require, exports, module) { 
    // This is kind of like "using FooBar" in other languages. 
    var Foo = require("FooBar").Foo; 

    exports.Bar = function() { 
     this.init(); 
    }; 
    exports.Bar.prototype = { 
     init: function() { 
      this.foo = new Foo(); 
     } 
    }; 
}); 

// elsewhere.js 
define(function (require, exports, module) { 
    var Foo = require("FooBar").Foo; 
    var Bar = require("Bar").Bar; 

    console.log(new Foo()); 
    console.log(new Bar()); 
}); 
+0

這是一個很多額外的東西我在做什麼,而不是完成我需要什麼。鑑於目前的系統,這可以完全相同地實施。 – Ixonal 2011-12-28 02:20:26

+0

部分原因在於你是否希望其他JS程序員能夠理解你的代碼。這個模塊系統是標準的,而你提出的東西會讓人瞪大眼睛,想知道你的腦子裏發生了什麼(弄亂像這樣的全球範圍就是瘋狂!),並立即強烈要求重構這個瘋狂的東西。 – Domenic 2011-12-28 02:24:39

+0

+1 - 這個回答的開頭讓我大笑 – 2011-12-28 03:27:22

相關問題