2008-08-22 29 views
9

Tôi đã có một JavaScript "đối tượng", được xây dựng theo cách này:Làm thế nào để cung cấp namespace trong JavaScript với các đối tượng instance

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

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

... 

Tôi biết làm thế nào để mô phỏng không gian tên với các đối tượng singleton JavaScript, nhưng những gì là cách tốt nhất để "namepace" một đối tượng như vậy ở trên mà sẽ được nâng cao?

Tôi biết rằng một số thư viện JavaScript có khả năng đặt tên, nhưng tôi đang sử dụng jQuery và không muốn thêm thư viện khác vào danh sách kết hợp. Tôi muốn có thể cung cấp cho riêng mình, có lẽ bằng cách khai thác jQuery, lược đồ không gian tên nội tại cho các đối tượng JS của tôi cần phải được nâng cấp.

Cảm ơn rp

Trả lời

11

đơn giản:

if(!MyNamespace) MyNamespace = {}; 

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

Misses nguyên mẫu tạo từ instanceof shoudl không hoạt động. – Chameleon

+0

@Chameleon - huh? Bạn đang nói về cái gì vậy ?! "nguyên mẫu" là một tài sản tự động, nó không phải được "tạo ra" cho mỗi lời khuyên –

2

nên không có nhiều khác nhau:

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

hoặc bạn có thể sử dụng

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

để tiết kiệm một số cách gõ.

6

Javascript không thực sự có namespace hoặc gói như các ngôn ngữ khác. Thay vào đó nó có đóng cửa. Nếu bạn có một ứng dụng bao gồm nhiều hàm, các biến và các đối tượng, thì bạn nên đặt chúng bên trong một đối tượng chung duy nhất. Điều này sẽ có tác dụng tương tự như một không gian tên.

Ví dụ:

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

Bạn cũng có thể tạo ra một tập các đối tượng lồng nhau và mô phỏng gói:

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"); 
+0

Lời khuyên tốt - nhưng tôi nghĩ bạn muốn dấu hai chấm thay vì dấu chấm phẩy trong ví dụ đầu tiên của bạn, không? – harpo

2

Cả hai câu trả lời rất hữu ích! Đây là những gì tôi đã kết thúc với:

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

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

Sau đó, sử dụng kết quả "namespaced" đối tượng:

var x = new rpNameSpace.foo() 

display(x.getLength()); 
-1

Một lựa chọn khác có thể là bob.js khuôn khổ:

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'); 
Các vấn đề liên quan