2010-07-12 36 views
5

Tôi tương đối mới khi sử dụng oop trong Javascript và tôi tự hỏi phương pháp hay nhất là dành cho phương pháp riêng tư. Ngay bây giờ, tôi đang sử dụng mootools để tạo các lớp của mình và tôi đang mô phỏng các phương thức riêng bằng cách đặt trước chúng với một dấu gạch dưới và buộc bản thân mình không gọi phương thức bên ngoài lớp. Vì vậy, lớp học của tôi trông giống như:Phương pháp riêng trong lớp Mootools

var Notifier = new Class(
{ 
    ... 
    showMessage: function(message) { // public method 
     ... 
    }, 

    _setElementClass: function(class) { // private method 
     ... 
    } 
}); 

Đây có phải là cách tốt/tiêu chuẩn để xử lý các phương pháp riêng tư trong JS không?

Trả lời

12

MooTools cung cấp phương thức protect về chức năng, vì vậy bạn có thể gọi bảo vệ theo bất kỳ phương pháp nào bạn muốn bảo vệ khỏi bị gọi bên ngoài Class. Vì vậy, bạn có thể làm:

​var Notifier = new Class({ 
    showMessage: function(message) { 

    }, 
    setElementClass: function(klass) { 

    }.protect() 
})​; 

var notifier = new Notifier(); 
notifier.showMessage(); 
notifier.setElementClass(); 
> Uncaught Error: The method "setElementClass" cannot be called. 

Không phải là class là từ khóa được đặt trước trong JavaScript và mã của bạn có thể bị hỏng khi sử dụng. Nó chắc chắn phá vỡ trên Safari vào thời điểm này, nhưng hành vi trong các trình duyệt khác không được đảm bảo là tốt, vì vậy tốt hơn hết là không sử dụng class làm định danh.

Một ưu điểm của việc sử dụng protect vì việc tự đóng cửa là nếu bạn mở rộng lớp này, bạn vẫn có thể truy cập các phương thức được bảo vệ trong các lớp con.

Notifier.Email = new Class({ 
    Extends: Notifier, 

    sendEmail: function(recipient, message) { 
     // can call the protected method from inside the extended class 
     this.setElementClass('someClass'); 
    } 
}); 

var emailNotifier = new Notifier.Email(); 
emailNotifier.sendEmail("a", "b"); 
emailNotofier.setElementClass("someClass"); 
> Uncaught Error: The method "setElementClass" cannot be called. 

Nếu bạn muốn sử dụng quy ước đặt tên như tiền tố hoặc hậu tố _ trước hoặc sau một phương pháp thì điều đó cũng hoàn toàn ổn. Hoặc bạn có thể kết hợp các _ với các phương pháp được bảo vệ.

+0

Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn rất nhiều! Tôi sẽ phải kiểm tra lại các tài liệu mootools lần sau. – aubreyrhodes

2

Vâng, miễn là bạn vẫn nhất quán, bạn sẽ không gặp rắc rối.

Có một mẫu mặc dù, để tạo quyền riêng tư thực sự trong javascript qua đóng cửa.

var Notifier = function() { 

    // private method 
    function setElementClass(class) { 
     //... 
    } 

    // public method 
    this.showMessage = function(message) { 
     // ... 
     setElementClass(...) // makes sense here 
    }; 
}; 

var noti = new Notifier(); 
noti.showMessage("something");  // runs just fine 
noti.setElementClass("smth else"); // ERROR: there isn't such a method 

Nếu bạn muốn thêm phương thức công cộng được kế thừa và chia sẻ giữa tất cả các đối tượng (dấu chân bộ nhớ nhỏ hơn), bạn nên thêm chúng vào mẫu thử của đối tượng.

// another way to define public functions 
// only one will be created for the object 
// instances share this function 
// it can also be used by child objects 
// the current instance is accessed via 'this' 
Notifier.prototype.showMessage = function() { 
    // ... 
    this.otherPublicFunction(...); 
};​ 

Tôi khuyên bạn nên xem xét cách xử lý thô đối tượng trong javascript, bởi vì chỉ khi đó bạn mới có thể biết bạn đang làm gì. Mootools giống như các lớp học sẽ là tốt để ẩn những gì ngôn ngữ này khác với những người khác. Nhưng sự thật là nó khác nhau rất nhiều mà nó sẽ được ngây thơ để nghĩ rằng bạn làm điều tương tự khi bạn nói class trong javascript, giống như trong bất kỳ ngôn ngữ OO dựa trên lớp khác.

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