2012-07-04 24 views
5

Ai đó có thể giải thích đoạn trích này từ Single Page Apps in Depth có nghĩa là gì?Ẩn các phương thức lớp học bằng cách sử dụng .call/.apply

Một mô hình chung cho các lớp học (ví dụ đối tượng khởi tạo từ một nguyên mẫu ) chỉ đơn giản là đánh dấu phương thức lớp dưới dạng riêng tư bằng cách bắt đầu họ với một dấu gạch dưới. Bạn có thể ẩn các phương thức lớp học đúng cách bằng cách sử dụng .call/.apply để đặt "this", nhưng tôi sẽ không hiển thị nó ở đây; đó là chi tiết nhỏ .

Tôi nghĩ rằng có một cách để thực sự làm cho các phương pháp JavaScript 'riêng tư' thực sự không thể truy cập thay vì quy ước chỉ đánh dấu chúng bằng dấu gạch dưới, nhưng tôi không thể tưởng tượng được triển khai nó sẽ được sử dụng như thế nào.

+0

+1 cho liên kết đến một trang Ứng dụng ebook! cảm ơn.. – renatoargh

Trả lời

3
var Treasure = function(){ 
    function locate(){ 
    return this.x * this.y + 31337; 
    } 

    function Treasure(x, y){ 
    this.x = x; 
    this.y = y; 
    } 

    Treasure.prototype.find = function find(){ 
    return locate.call(this); 
    }; 

    return Treasure; 
}(); 

locate là một chức năng riêng được chia sẻ cho các phương thức khởi tạo và nguyên mẫu. Sử dụng call nó có thể hoạt động như một phương pháp và sử dụng this.

Triển khai hoàn chỉnh hơn khái niệm này là đối tượng giao diện và đối tượng triển khai. Thay vì có một vài hàm ngẫu nhiên-như-phương thức (tương tự như định vị ở trên), bạn thực sự tạo ra một lớp toàn bộ là riêng tư. Mọi tạo ra bên ngoài của giao diện kết quả trong hai đối tượng crated: giao diện shell công cộng và đối tượng thực hiện riêng tư. Điều này cho phép bạn hiển thị giao diện cung cấp một API khác, có lẽ dễ sử dụng hơn. Hoặc có thể cho phép bạn sử dụng lại các đối tượng thực hiện riêng lẻ cho toàn bộ các nhóm đối tượng giao diện.

Đây thực sự là cách DOM được chỉ định để hoạt động (thường không được triển khai trong js). Ví dụ, các đối tượng giao diện (ví dụ như các phần tử và các đối tượng nút) được yêu cầu cụ thể để bao bọc việc triển khai cơ bản thực sự thực hiện từ đó. Các đối tượng tiếp xúc nhỏ hơn nhiều so với các shell để chuyển tiếp truy cập thuộc tính và lời gọi phương thức.

Dom.js là một triển khai DOM toàn diện được thực hiện trong giây. Một kỹ thuật thú vị mà tôi đã làm quen với khi làm việc trong đó là việc tạo ra các giao diện công cộng hoàn toàn tự động. Đây là mục đích của IDL: API công khai được tạo theo nghĩa đen một cách tự động, chỉ để thực hiện riêng tư thực sự được tạo ra. Điều này thực sự có nghĩa là có thể tạo ra những thứ như thế này mà không cần tham khảo ý kiến ​​của con người: https://github.com/Benvie/svgstuff/blob/master/lib/defs.js

1

Bạn có thể thấy hai loại biến trong ví dụ này. Bạn sẽ lưu ý đầu tiên là tư nhân, thứ hai có thể truy cập công khai:

function x() { 
    var _var1 = "hello"; 
    this.var2 = "world"; 
    x.prototype.innerTest = function() { 
     console.log("inner var1: " + _var1); 
     console.log("inner var2: " + this.var2); 
    } 
} 

var y = new x; 
console.log("var1: " + y._var1); 
console.log("var2: " + y.var2); 

// var1: undefined 
// var2: world 

Chạy thử nghiệm bên trong cho thấy var1 thể được truy cập từ bên trong lớp:

y.innerTest(); 
// var1: hello 
// var2: world 
Các vấn đề liên quan