2012-06-10 48 views
9

Tôi đã đọc rằng việc tạo không gian tên cho các dự án JavaScript giúp giảm xung đột với các thư viện khác. Tôi có một số mã với rất nhiều loại đối tượng khác nhau mà tôi đã xác định hàm xây dựng. Có thực hành tốt để đặt các bên trong không gian tên là tốt?các nhà xây dựng bên trong một không gian tên

Ví dụ:

var shapes = { 
    Rectangle: function(w, h) { 
     this.width = w; 
     this.height = h; 
    } 
}; 

mà có thể được gọi thông qua:

var square = new shapes.Rectangle(10,10); 
+3

tôi nghĩ là một ý tưởng tốt –

+0

constructor của bạn, đó là một chức năng, trở thành một * biểu thức hàm * thay vì khai báo hàm * nếu bạn gán nó cho một thuộc tính đối tượng trong một "không gian tên" thay vì chỉ đơn giản là viết 'hàm Rectangle (w, h) {}'. Điều này có sự khác biệt nhỏ: https: //developer.mozilla.org/de/docs/Web/JavaScript/Tham khảo/Chức năng Khác hơn thế, nó không gây ô nhiễm không gian tên toàn cầu, đó là một điều tốt, như những người khác đã chỉ ra. – caw

Trả lời

4

Không gian tên này được gọi là "Singleton pattern" và đó là một trong những mẫu chính được đề xuất bởi cuốn sách mẫu thiết kế nổi tiếng "Gang of Four".

Từ tuyệt vời (và miễn phí) cuốn sách Learning JavaScript Design Patterns:

cổ điển, mô hình Singleton thể được thực hiện bằng cách tạo ra một lớp với một phương pháp tạo ra một thể hiện mới của lớp nếu một không hiện hữu. Trong trường hợp một cá thể đã tồn tại, nó chỉ đơn giản là trả về một tham chiếu đến đối tượng đó. Mẫu Singleton do đó được biết đến vì nó hạn chế sự khởi tạo của một lớp với một đối tượng duy nhất.

Trong JavaScript, singletons đóng vai trò là nhà cung cấp không gian tên phân tách mã thực hiện từ không gian tên chung để cung cấp một điểm truy cập duy nhất cho các chức năng .

Họ có thể đảm nhận một số hình thức khác nhau, nhưng trong hầu hết các cơ bản của nó, một Singleton có thể được thực hiện như một đối tượng đen nhóm lại với nhau với các chức năng liên quan và thuộc tính của nó ...

Vì vậy, có , nó là một khái niệm được sử dụng nhiều trong nhiều ngôn ngữ lập trình và là một tuyệt vời để ngăn chặn các va chạm đối tượng không gian tên toàn cầu trong JavaScript.

Xem thêm: Simplest/Cleanest way to implement singleton in JavaScript?

+1

Tuyệt vời. Cảm ơn rất nhiều. Cũng cảm ơn cho các liên kết. Tôi đã không thấy bất kỳ ví dụ nào của bất cứ ai gọi là 'mới' cho một hàm trong một không gian tên và tự hỏi liệu có lý do nào cho điều đó không. – Joe

+0

Không có lý do gì mà tôi có thể nghĩ đến. Chức năng mới là sự thừa kế nguyên mẫu của JavaScript, thường được sử dụng trong thực tế như là một thừa kế giống như lớp. Hầu hết các ví dụ bạn sẽ thấy xác định chỉ là một "lớp", nhưng nếu bạn đang cố gắng tổ chức một nhóm chúng thì mẫu đơn sẽ giống nhau nếu không hữu ích hơn. – buley

+2

@joe tất nhiên, nó không được coi là mẫu đơn nếu đối tượng theo nghĩa đen chứa các nhà thầu ;-) –

2

Yes. Bạn nên gây ô nhiễm không gian tên chung tối thiểu có thể là

2

Yeah, đó là một ý tưởng tốt, vì bạn tránh những rắc rối và khó hiểu do gây ô nhiễm không gian tên toàn cầu. Mặc dù cá nhân tôi sẽ thay đổi shapes thành shape, vì vậy bạn có thể có một số shape.Rectangle, điều này có ý nghĩa hơn một chút đối với tôi (sau cùng thì, Hình chữ nhật chỉ là một đối tượng).

1

Bên cạnh đó không gây ô nhiễm không gian tên, nó cũng cho phép bạn để làm kiểm tra kiểu gia đình:

function doSomethingTo(shape) { 
    var shapeName, validArg; 

    for (shapeName in shapes) { 
    validArg = validArg || shape instanceof shapes[shapeName]; 
    } 

    if (!validArg) throw "Argument is not a shape."; 
} 
5

này nói chung là một ý tưởng tốt; thêm vào đó, nếu đối tượng của bạn đòi hỏi một tập hợp các chức năng chia sẻ rằng không nên tiếp xúc với bạn có thể bọc chúng trong một kết thúc, giống như một mô-đun:

var shapes = (function() { 
    // private variables 
    var foo = 0; 

    // private function 
    function get_area(w, h) 
    { 
    return w * h; 
    } 

    return { 
    Rectangle: function(w, h) { 
     this.width = w; 
     this.height = h; 
     // call private function to determine area (contrived example) 
     this.area = get_area(w, h); 
    } 
    } 
}()); 

var s = new shapes.Rectangle(100, 5); 
Các vấn đề liên quan