2008-08-22 33 views
9

我有一個JavaScript的「對象」,這種方式構建的:如何提供命名空間在JavaScript中使用實例化對象

function foo() 
{ 
    this.length = 0; 
} 

foo.prototype.getLength = function() 
{ 
    return this.length; 
} 

... 

我知道如何模仿命名空間與單JavaScript對象,但什麼是最好的方法到「命名空間」一個對象,如上面那個會引發?

我知道幾個JavaScript庫具有名稱空間功能,但我使用的是jQuery,而不是將另一個庫添加到組合中。我希望能夠提供我自己的,也許通過利用jQuery,我的JS對象的內部命名空間方案需要實例化。

感謝 RP

回答

11

簡單:

if(!MyNamespace) MyNamespace = {}; 

MyNamespace.foo = function() { 
    this.length = 0; 
}; 
MyNamespace.foo.prototype.getLength = function() { 
    return this.length; 
}; 
+0

小姐原型創作,因爲instanceof shoudl不起作用。 – Chameleon 2012-06-27 07:35:47

+0

@Chameleon - 嗯?你在說什麼?! 「原型」是一個屬性自動,它不必被「創建」本身 – 2015-11-10 20:56:02

2

應該不會有太大的不同:

namespace.foo = function foo() {...} 
namespace.foo.prototype.getLength = function() { ... } 

或者你可以使用

(function() { 
    function foo() { ... } 
    foo.prototype... 
    namespace.foo = foo; 
})(); 

節省一些打字。

6

JavaScript並沒有真正的命名空間或包像其他語言。相反,它已經關閉。如果您有一個由多個函數,變量和對象組成的應用程序,那麼您應該將它們放入一個全局對象中。這與名稱空間具有相同的效果。

例如:

var namespace = { 
    this.foo: function(){ 
    ... 
    }, 
    this.foo.prototype.getLength: function(){ 
    ... 
    } 
} 

您還可以創建一組嵌套對象和模擬包:

loadPackage = function(){ 
    var path = arguments[0]; 
    for(var i=1; i<arguments.length; i++){ 
    if(!path[arguments[i]]){ 
     path[arguments[i]] = {}; 
    } 
    path = path[arguments[i]]; 
    } 
    return path; 
} 

loadPackage(this, "com", "google", "mail") = { 
    username: "gundersen", 
    login: function(password){ 
    ... 
    } 
} 
this.com.google.mail.login("mySecretPassword"); 
2

兩個答案是非常有益的!這是我結束了:

if(typeof(rpNameSpace) == "undefined") rpNameSpace = {}; 

rpNameSpace.foo = function() { 
    this.length = 613; 
} 
rpNameSpace.foo.prototype.getLength = function() { 
    return this.length * 2; 
} 

然後,利用由此產生的 「命名空間」 對象:

var x = new rpNameSpace.foo() 

display(x.getLength()); 
-1

另一種選擇是bob.js框架:

bob.ns.setNs('myApp.myFunctions', { 
    say: function(msg) { 
     console.log(msg); 
    } 
}); 

//sub-namespace 
bob.ns.setNs('myApp.myFunctions.mySubFunctions', { 
    hello: function(name) { 
     myApp.myFunctions.say('Hello, ' + name); 
    } 
}); 

//call: 
myApp.myFunctions.mySubFunctions.hello('Bob'); 
相關問題