function foo() {
var bar = function() { console.log("i'm a private method"); return 1; };
var iAmAPrivateVariable = 1;
return {
publicMethod: function() { alert(iAmAPrivateVariable); },
publicVariable: bar()
}
}
//usage
var thing = foo()
Đây được gọi là appoach chức năng, vì bạn thực sự tận dụng bao đóng gói để đóng gói (đây là cách duy nhất để thực hiện nó trong javascript).
Nói chung, bạn không nên làm OO trong javascript, nó không phải là một ngôn ngữ tuyệt vời cho nó vì nhiều lý do. Hãy suy nghĩ về lược đồ với các dấu ngoặc nhọn và dấu chấm phẩy, và bạn sẽ bắt đầu viết ngôn ngữ giống như các chuyên gia. Điều đó đang được nói, đôi khi OO phù hợp hơn. Trong những trường hợp, ở trên thường là đặt cược tốt nhất
EDIT: để mang lại thừa kế vào trộn
function parent() {
return { parentVariable: 2 };
}
function foo() {
var bar = function() { console.log("i'm a private method"); return 1; };
var iAmAPrivateVariable = 1;
me = parent();
me.publicMethod = function() { alert(iAmAPrivateVariable); };
me.publicVariable = bar();
return me;
}
này làm cho mọi thứ một chút complected hơn, nhưng hoàn thành kết quả cuối cùng mong muốn trong khi vẫn tham gia một cách tiếp cận chức năng với các khái niệm OO (trong trường hợp này, sử dụng các hàm trang trí thay vì thừa kế thực). Những gì tôi thích về toàn bộ cách tiếp cận là chúng tôi vẫn đang thực sự xử lý các đối tượng theo cách mà chúng được dự định trong loại ngôn ngữ này - một túi tài sản mà bạn có thể đính kèm theo ý muốn.
EDIT2:
Chỉ muốn cung cấp tín dụng mà tín dụng là do, phương pháp này là đơn giản hơn rất nhẹ với những gì Doug Crockford gợi ý trong Javascript: The Good Parts. Nếu bạn muốn đưa kỹ năng js của bạn lên cấp độ tiếp theo, tôi sẽ khuyên bạn nên bắt đầu từ đó. Tôi không nghĩ rằng tôi đã học được rất nhiều từ một cuốn sách nhỏ như vậy.
Một lưu ý khác là cực kỳ khác biệt, bạn sẽ thấy phần lớn thời gian trong hầu hết các công việc bạn làm, và thường rất khó giải thích a) điều gì đang xảy ra và b) tại sao là một ý tưởng hay với đồng nghiệp.
Nguồn
2010-09-16 00:40:50
Tôi thích điều này rất nhiều. Nó có thể được uốn cong để cung cấp thừa kế mà không cần sử dụng nguyên mẫu? – spender
'bar' sẽ trở thành thuộc tính của đối tượng chung (' window.bar'), vì nó không được khai báo với câu lệnh 'var' trong phạm vi của hàm' foo'. Cũng trong ECMAScript 5 Strict Mode, nó sẽ cung cấp cho bạn một 'ReferenceError', vì vậy luôn luôn sử dụng' var' để * khai báo * một biến;) – CMS
@CMS wow ... đã gây khó chịu ... –