2012-04-28 22 views
5

Tôi đã đọc liên kết này http://addyosmani.com/largescalejavascript/#modpatternđóng gói trong mô hình mô-đun javascript

Và xem ví dụ sau.

var basketModule = (function() { 
var basket = []; //private 

return { //exposed to public 
     addItem: function(values) { 
      basket.push(values); 
     }, 
     getItemCount: function() { 
      return basket.length; 
     }, 
     getTotal: function(){ 
      var q = this.getItemCount(),p=0; 
      while(q--){ 
       p+= basket[q].price; 
      } 
     return p; 
     } 
     } 
}()); 

basketModule.addItem({item:'bread',price:0.5}); 
basketModule.addItem({item:'butter',price:0.3}); 

console.log(basketModule.getItemCount()); 
console.log(basketModule.getTotal()); 

Nó stats rằng "Các mô hình mô-đun là một thiết kế phổ biến mà mô hình đó gói gọn 'riêng tư', nhà nước và tổ chức sử dụng đóng cửa" Làm thế này là khác nhau từ viết nó như dưới đây? Không thể riêng tư được thực thi đơn giản với phạm vi chức năng?

var basketModule = function() { 
var basket = []; //private 
     this.addItem = function(values) { 
      basket.push(values); 
     } 
     this.getItemCount = function() { 
      return basket.length; 
     } 
     this.getTotal = function(){ 
      var q = this.getItemCount(),p=0; 
      while(q--){ 
       p+= basket[q].price; 
      } 
     return p; 
     } 

} 

var basket = new basketModule(); 

basket.addItem({item:'bread',price:0.5}); 
basket.addItem({item:'butter',price:0.3}); 

Trả lời

3

Trong biến thể đầu tiên bạn tạo đối tượng mà không có khả năng tạo phiên bản mới của nó (đó là hàm tức thời ngay lập tức). Ví dụ thứ hai là một hàm contructor đầy đủ, cho phép một vài trường hợp. Việc đóng gói là như nhau trong cả hai ví dụ, các basket Array là 'tư nhân' trong cả hai.

Just for fun: tốt nhất của cả hai thế giới có thể là:

var basketModule = (function() { 
    function Basket(){ 
     var basket = []; //private 
     this.addItem = function(values) { 
      basket.push(values); 
     } 
     this.getItemCount = function() { 
      return basket.length; 
     } 
     this.getTotal = function(){ 
      var q = this.getItemCount(),p=0; 
      while(q--){ 
       p+= basket[q].price; 
      } 
     return p; 
     } 
    } 
    return { 
    basket: function(){return new Basket;} 
    } 
}()); 
//usage 
var basket1 = basketModule.basket(), 
    basket2 = basketModule.basket(), 
+0

Tôi đoán câu hỏi của tôi hiện đang là mô hình đầu tiên hơn "module" hơn so với thứ hai. Liên kết sử dụng biến thể đầu tiên làm ví dụ rõ ràng về mẫu mô-đun. – eirikrl

+0

Tôi muốn nói biến thể đầu tiên phản ánh mẫu mô-đun (phân phối 'rổModule'), biến thể thứ hai cung cấp cách tạo các trường hợp' rổ' * *. Đó là tất cả các vấn đề ghi nhãn bằng cách này, bạn có thể đặt tên biến thể đầu tiên cũng là 'mẫu đơn'. – KooiInc

+0

Từ quan điểm cho rằng một mô-đun là một gói chức năng riêng biệt hơn là một tập hợp các lớp instantiatable, sau đó có. Tuy nhiên sự khác biệt giữa hai thiết kế không quá nhiều, đó là cú pháp. Không có gì ngăn cản bạn có một singleton cách thứ hai bằng cách có 'var basketModule = new function() {...};'. Ý tưởng sử dụng một đối tượng trả về là bạn có thể ngưng tụ giao diện thành một vài dòng mã nếu bạn thích, vì vậy bạn có thể nhìn thấy nó trong nháy mắt. Nhưng bạn sẽ không sử dụng các hàm ẩn danh lớn cho điều này, bạn sẽ chỉ làm 'return {publicFunc: privateFunc};'. –