2011-09-22 35 views
7

Tôi muốn giữ lại kịch bản của tôi được tổ chức trong một tập tin .js cho tất cả các trang web của tôi (Tôi có một mớ hỗn độn ngay bây giờ), một cái gì đó giống như không gian tên và các lớp trong C# ...Đây có phải là mô hình tốt cho các tập lệnh jQuery của tôi không?

(function ($) { 

    //private variables 
    $.divref = $("#divReference"); 

    //Namespaces 
    window.MySite = {}; 
    window.MySite.Home = {}; 
    window.MySite.Contact = {}; 

    //Public function/method 
    window.MySite.Home.Init = function(params){ 
     alert("Init"); 

     MySite.Home.PrivateFunction(); 

     $.divref.click(function(){ 
      alert("click"); 
     }); 
    }; 

    //private function/method 
    MySite.Home.PrivateFunction = function(){ 
     alert("Private"); 
    }; 

})(jQuery); 

này là đúng? đây có phải là cách tốt hơn không? Tôi là loại mới trong jQuery và JScript. Cảm ơn thời gian và câu trả lời của bạn.

+6

Cách tiếp cận của bạn để tạo biến riêng tư là sai. Bạn đang đính kèm chúng vào đối tượng $, sẽ tồn tại sau khi mã của bạn đã hoàn thành việc thực thi. Bạn muốn đóng cửa cho điều đó. –

+1

@ g.d.d.c Điều đó sẽ tạo ra một câu trả lời tốt. – vhallac

Trả lời

1

Đây là chi tiết làm thế nào tôi sẽ thực hiện các mô hình bạn đang cố gắng để làm:

// MySite.Home Extension 
window.MySite = 
    (function ($, root) { 

     //private variables 
     var $divref = $("#divReference"); 

     //private function/method 
     var privateFunction = function(){ 
      alert("Private"); 
     };   

     root.Home = {}; 

     // Public variable 
     root.Home.prop = "Click" 

     //Public function/method 
     root.Home.Init = function(params){ 
      alert("Init"); 

      private(); 

      $divref.click(function(){ 
       alert(root.Home.prop); 
      }); 
     }; 

     return root; 

    })(jQuery, window.MySite || {}); 

// MySite.Contact Extension 
window.MySite = 
    (function ($, root) { 

     root.Contact = {}; 

     // More stuff for contact 

     return root; 

    })(jQuery, window.MySite || {}); 

Sự thay đổi đầu tiên được chia mỗi "namespace" vào mô hình mô-đun riêng của mình, các biến để tin sẽ không chảy máu từ namespace để namespace (nếu bạn có ý định họ được riêng tư cho không gian tên, mà sẽ được nhiều hơn C# esque). Thứ hai là thay vì truy cập window.MySite, vượt qua trong đối tượng mà bạn muốn mở rộng (trong trường hợp này tôi gọi nó là root). Điều này sẽ cung cấp cho bạn một số tính linh hoạt.

Phương thức riêng riêng của bạn không thực sự riêng tư. Để tạo một phương thức riêng, bạn chỉ muốn tạo một hàm var mà nó bị ràng buộc trong việc đóng, nhưng không được gán cho một thuộc tính trên đối tượng nhìn thấy được bên ngoài. Cuối cùng, có thể bạn không muốn sử dụng $.somegarbage. Như đã đề cập trong một nhận xét, bạn đang thêm thuộc tính vào đối tượng $, đối tượng này sẽ vẫn ở đó khi việc đóng được thực hiện. Nếu bạn muốn một cái gì đó gần gũi, tôi sẽ chỉ sử dụng $somegarbage mà một số người có vẻ thích, nhưng bất kỳ tên biến nào cũng sẽ hoạt động cho các biến riêng tư, miễn là biến đó bị ràng buộc trong phạm vi đóng (không phải ở một nơi khác)

Bạn đang đi đúng hướng ...

3

Tôi sẽ tiếp tục và đăng bình luận của tôi như là một câu trả lời, mặc dù tôi không 100% giải quyết các câu hỏi của bạn về C# không gian tên và song song của chúng trong JavaScript (Tôi không có lập trình viên C#). Bạn không thực sự tạo các biến riêng tư bởi vì bạn đang gắn chúng vào đối tượng $ sẽ tồn tại sau khi hàm này kết thúc. Nếu bạn muốn biến riêng tư, bạn cần phải sử dụng một đóng cửa. Những giống như thế này:

var myObject = function() { 
    var innerVariable = 'some private value'; 

    return { 
    getter: function() { 
     return innerVariable; 
    } 
    } 
}() 

Nếu bạn cố gắng truy cập vào myObject.innerVariable nó sẽ trở lại undefined nhưng nếu bạn gọi myObject.getter() nó sẽ trả về giá trị chính xác. Khái niệm này là khái niệm bạn sẽ muốn đọc trong JavaScript và cho lập trình nói chung. Hy vọng rằng sẽ giúp.

+0

Có bạn đúng, tôi không nhận thấy điều đó. Họ là những biến công cộng rồi-. cảm ơn – jsn00bs

0

bạn có thể muốn đọc trên Module pattern (more) và đóng trong javascript để ngăn chặn gây ô nhiễm không gian tên chung.

Các vấn đề liên quan