2011-12-20 28 views
13

Khi triển khai mẫu mô-đun, các hàm riêng tư truy cập các thuộc tính riêng của mô-đun như thế nào? Tôi đã không nhìn thấy bất kỳ ví dụ mà các nhà phát triển làm điều này. Có lý do gì để không?Mẫu mô-đun JavaScript: Cách thức các phương thức riêng truy cập phạm vi của mô-đun?

var module = (function(){ 
    // private property 
    var number = 0; 

    // private method 
    _privateIncrement = function(){ 
     // how do I access private properties here? 
     number++; 
    }; 

    // public api 
    return { 
     // OK 
     getNumber: function(){ 
      return number; 
     }, 
     // OK 
     incrNumber: function(){ 
      number++; 
     }, 
     // Doesn't work. _privateIncrement doesn't have 
     // access to the module's scope. 
     privateIncrNumber: function(){ 
      _privateIncrement(); 
     } 
    }; 
})(); 
+7

Hoạt động tốt: http://jsfiddle.net/DREKt/ Mặc dù bạn có thể muốn đặt trước '_privateIncrement' bằng khai báo' var'. – Dennis

+0

nếu 'số' không bị ràng buộc trong phần đóng của mô-đun, và là một phần của đối tượng, thì bạn có thể cần sử dụng' apply() 'hoặc' call() 'để gọi phương thức riêng trong ngữ cảnh chính xác. '_privateIncrement.call (this)' –

Trả lời

10

Khi thực hiện mô hình mô-đun, làm thế nào để các chức năng tin truy cập vào tài sản riêng của các module?

Các thuộc tính trong phạm vi, vì vậy họ "chỉ làm"

Không làm việc.

Vâng, đúng vậy.

_privateIncrement không có quyền truy cập vào phạm vi của mô-đun.

Vâng, đúng vậy.

Xem live example các nội dung sau:

var module = (function(){ 
    // private property 
    var number = 0; 

    // global method 
    _privateIncrement = function(){ 
     number++; 
    }; 

    // public api 
    return { 
     // OK 
     getNumber: function(){ 
      return number; 
     }, 
     // OK 
     incrNumber: function(){ 
      number++; 
     }, 
     // Does work! 
     privateIncrNumber: function(){ 
      _privateIncrement(); 
     } 
    }; 
})(); 

// Show default value 
document.body.innerHTML += (module.getNumber()); 
// Increment 
module.privateIncrNumber(); 
// Show new value 
document.body.innerHTML += (module.getNumber()); 
// Increment (since _privateIncrement was defined as a global!) 
_privateIncrement(); 
// Show new value 
document.body.innerHTML += (module.getNumber()); 

// Output: 012 
+1

+1 mặc dù tôi nghĩ OP bằng cách nói "_how làm các hàm riêng truy cập các thuộc tính riêng của module_" cố giải thích rằng người đó muốn truy cập các thuộc tính của đối tượng được trả về (ví dụ 'getNumber() 'method) từ bên trong hàm' _privateIncrement() '. – Tadeck

+0

Quentin là đúng. Tôi đã có một lỗi ở nơi khác trong hệ thống của tôi đã được ném ra khỏi biến riêng. Cảm ơn bạn. – Thomas

3

Một thay thế cho có phương pháp riêng với quyền truy cập vào các this là bằng call hoặc apply phương pháp.

function Restaurant() 
{ 
    this.mongoose = 'beans'; 
    this.freedom = {bear:'love',a:'12'}; 

    var myPrivateVar; 

    var private_stuff = function() // Only visible inside Restaurant() 
    { 
     myPrivateVar = "I can set this here!"; 
     this.mongoose = 12; 
    } 

    this.use_restroom = function() // use_restroom is visible to all 
    { 
     private_stuff(); 
    } 

    this.buy_food = function() // buy_food is visible to all 
    { 
     private_stuff(); 
    } 

    private_stuff.call(this); 
} 

var bobbys = new Restaurant(); 

Tất nhiên, bạn sẽ di chuyển use_restroom và purchase_food thành nguyên mẫu và private_stuff bên ngoài nhà xây dựng nếu bạn định có nhiều trường hợp của đối tượng này.

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