2010-06-12 25 views
5

Tôi đã cố gắng để tìm hiểu bao đóng (trong Javascript), mà loại đau não của tôi sau khi quá nhiều năm với C# và C + +. Tôi nghĩ rằng bây giờ tôi có một sự hiểu biết cơ bản, nhưng có một điều làm tôi bực mình: Tôi đã ghé thăm rất nhiều trang web trong nhiệm vụ tri thức này, và không nơi nào tôi thấy một từ (hoặc thậm chí một cụm từ hai từ đơn giản) có nghĩa là "một tập hợp của các bao đóng Javascript có chung ngữ cảnh thực thi chung "#:. Ví dụ:Bạn gọi một tập hợp các đóng Javascript có chung một ngữ cảnh chung nào?

 
function CreateThingy (name, initialValue) 
{ 
    var myName = name; 
    var myValue = initialValue; 

    var retObj = new Object; 

    retObj.getName = function() { return myName; } 
    retObj.getValue = function() { return myValue; } 
    retObj.setValue = function(newValue) { myValue = newValue; } 

    return retObj; 
}; 

Từ những gì tôi đã đọc, đây có vẻ là một cách phổ biến để thực hiện ẩn dữ liệu. Giá trị trả về bởi CreateThingy là, tất nhiên, một đối tượng, nhưng những gì bạn sẽ gọi là tập hợp các chức năng đó là tài sản của đối tượng đó? Mỗi cái là một đóng, nhưng tôi muốn một cái tên tôi có thể dùng để mô tả (và suy nghĩ về) tất cả chúng với nhau như một thực thể khái niệm, và tôi muốn sử dụng cái tên thường được chấp nhận hơn là tạo ra một cái tên.

Cảm ơn!

- Ed

Trả lời

3

Crockford phổ biến thuật ngữ "privileged method" để đặt tên cho các chức năng có quyền truy cập đến phạm vi của constructor của nó (nơi các thành viên riêng được khai báo).

Tôi sẽ gọi cho họ "Một tập hợp các hàm JavaScript có chung phạm vi bao quanh".

Các "thực hiện bối cảnh" phần của cụm từ bạn gửi, có thể tạo ra sự nhầm lẫn giữa Execution Contexts được mô tả trong các đặc điểm kỹ thuật, giá trị this, cũng thường được gọi là "chức năng bối cảnh" hoặc "đối tượng ngữ cảnh " và phạm vi chức năng, đây thực sự là những gì đang được tham chiếu tại đây.

0

Gần với mẫu mô-đun. Sử dụng cụm từ như vậy:

var thingy = (function(specObj) { 
    var my = {}, 
     privateVar = blah, 
     someOtherPrivateVar = []; 

    my.getSomeVal() { 
     return specObj.someVal; 
    } 
    my.getAnotherVal() { 
     return specObj.AnotherVal; 
    } 
}({ 
    someVal: "value", 
    anotherVal: "foo" 
})); 

Tôi đã khởi tạo với một đối tượng theo nghĩa đen vì sử dụng đối tượng được đặt tên sẽ cho phép thay đổi đối tượng được đặt tên. Có các tùy chọn khác để thực hiện việc này.

Đây là một liên kết tốt trên các biến thể của kiểu mô-đun: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

Hầu như đi mà không nói, nhưng Crockford Javascript: The Good Parts chứa một điều trị tốt đẹp của phong cách này và những lợi ích cụ thể của nó.

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