2013-03-13 24 views
5

tôi có các module sau đây với hai phương pháp, A()B():Thêm một phương pháp mới để hiện mô-đun đối tượng mẫu

var Module = (function() { 

    function A(){ 
     console.log("Module: A"); 
     B(); 
    }; 

    function B(){ 
     console.log("Module: B"); 
     Module.Utils.C(); /* Here is the problem */ 
    }; 

    return { 
     A:A, 
     B:B 
    } 

}()); 

Giả sử tôi muốn thêm một phương pháp mới C() ...

function C(){ 
     console.log("C"); 
    }; 

... vào mô-đun ở trên mà không cần chạm vào nó, tức là, tôi không muốn thay đổi mã hiện tại của Module nhưng để mở rộng nó để có thuộc tính mới C.

+0

Đây là một câu hỏi hay nhưng tôi đang bối rối bởi một phần của nó. Từ bit nhận xét của mã của bạn, nơi bạn chỉ ra nơi mà vấn đề của bạn là, có vẻ như bạn thực sự muốn mở rộng thuộc tính 'Utils' của' Module' không được định nghĩa trong mã của bạn. Vì vậy, bạn có muốn mở rộng 'Module' hoặc một đối tượng được gọi là' Utils' mà nên thuộc về 'Module'? – guypursey

+0

Một câu hỏi khác: Nên 'Utils' hoặc' C' là riêng tư hoặc công khai? Họ có nên được đặc quyền (tức là, có quyền truy cập vào các biến riêng tư trong phạm vi đóng của bạn) không? – guypursey

Trả lời

0

Bạn có thể thêm các phương pháp phản đối dynamicaly:

Module.Utils.C = function(){ 
    console.log("C"); 
}; 
+2

Điều đó đúng với điều kiện C không muốn truy cập bất kỳ biến hoặc hàm nào được xác định trong phần đóng. Và đó là mục đích chính của mô hình mô-đun, phải không? – zeroflagL

2

Bạn sẽ cần phải làm như sau sau khi định nghĩa module:

Module.Utils = Module.Utils || {}; 
Module.Utils.C = function(){ 
    console.log("C"); 
}; 

Các kiểm tra dòng đầu tiên cho dù Module.Utils được định nghĩa đã và xác định nó nếu nó không phải là. Phần tiếp theo sau đó gán chức năng C.

Nếu bạn cố gắng thực hiện Module.Utils.C = function(){ console.log("C"); }; thì bạn sẽ gặp lỗi về Module.Utils không được xác định.

Tôi đã tạo một fiddle đây cho thấy nó làm việc: http://jsfiddle.net/u5R4E/

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