2010-06-18 23 views
5

Tôi đang học JavaScript, và tôi không thể hiểu tại sao bạn lại tạo ra các phương thức mà không phải là 'đặc quyền', nghĩa là, không được định nghĩa trong constructor mà đúng hơn là nguyên mẫu của lớp.lý do tại sao tạo các phương pháp không có đặc quyền?

Tôi hiểu ý tưởng đóng gói và tất cả, nhưng bạn không bao giờ gói gọn các phần của một lớp từ phần còn lại của nó trong phần lớn thế giới OO.

Trả lời

18

Khi hàm được xác định trong hàm tạo, một thể hiện mới của hàm đó được tạo mỗi khi hàm tạo được gọi. Nó cũng có quyền truy cập vào các biến riêng.

var myClass = function() { 
    // private variable 
    var mySecret = Math.random(); 

    // public member 
    this.name = "Fred"; 

    // privileged function (created each time) 
    this.sayHello = function() { 
     return 'Hello my name is ' + this.name; 
     // function also has access to mySecret variable 
    }; 
} 

Khi hàm được xác định trên mẫu thử nghiệm, hàm này chỉ được tạo một lần và duy nhất chức năng đó được chia sẻ.

var myClass = function() { 
    // private variable 
    var mySecret = Math.random(); 

    // public member 
    this.name = "Fred"; 
} 

// public function (created once) 
myClass.prototype.sayHello = function() { 
    return 'Hello my name is ' + this.name; 
    // function has NO access to mySecret variable 
}; 

Vì vậy, việc xác định hàm trên nguyên mẫu sẽ tạo ra ít đối tượng hơn có thể mang lại hiệu suất tốt hơn cho bạn. Mặt khác, các phương thức công khai không có quyền truy cập vào các biến riêng tư. Các ví dụ và lý do khác có sẵn tại đây: http://www.crockford.com/javascript/private.html

+0

@aharon: Chỉ trong trường hợp: hãy thận trọng khi sử dụng ['this'] (http://blog.niftysnippets.org/2008/04/you-must-remember) -this.html). –

+0

Tôi đã cập nhật câu trả lời của mình để tạo sự khác biệt giữa công khai, riêng tư và đặc quyền rõ ràng hơn. – Greg

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