2010-02-14 17 views
6

Tôi đã quyết định tôi cần cải thiện kỹ năng lập trình javascript cũng như kỹ năng OO của mình. Tôi hiện đang đọc qua một số cuốn sách, nhưng đôi khi rất khó để có được một nắm bắt về lý thuyết mà không nhìn thấy một số ví dụ thực tế đầu tiên. Vì vậy, tôi có câu hỏi lý thuyết về "thực tiễn tốt nhất" cho trường hợp sau ...Câu hỏi thực hành tốt nhất về javascript hướng đối tượng: Tôi nên định cấu hình đối tượng của mình như thế nào sau đây

Tôi muốn tạo tập lệnh OO hiển thị danh sách các bản ghi tìm kiếm được truy xuất từ ​​máy chủ. Tôi cũng muốn có thể chỉnh sửa từng bản ghi thẻ tìm kiếm tại chỗ.

Hiện nay tôi đang làm điều này procedurally với một chút giúp đỡ từ các thư viện jQuery:

Tôi chấp nhận một danh sách JSON-mã hóa các hồ sơ searchtag từ máy chủ. Nó trông giống như thế này:

[ 
    { "searchTagName" : "tagOne", "searchTagID" : "1" }, 
    { "searchTagName" : "tagTwo", "searchTagID" : "2" }, 
    { "searchTagName" : "tagThree", "searchTagID" : "3" }, 
    etc... 
] 

tôi đổ JSON trực tiếp vào jTemplates để tạo ra html thích hợp, như vậy:

$("#searchTagList") 
    .setTemplateElement("template_searchTagList") 
    .processTemplate(searchTagData); 

Cuối cùng tôi muốn nó có thể sửa đổi mỗi searchtag với một Edit- phương pháp tại chỗ, vì vậy tôi đính kèm phương pháp chỉnh sửa tại chỗ cho mỗi phần tử html:

$(".searchTag").editInPlace(); 

Điều này hoạt động rất tốt về mặt thủ tục. Và có lẽ điều thông minh nhất là để lại đủ một mình. :) Nhưng, vì lợi ích của đối số, cách tốt nhất để viết một cái gì đó như thế này từ một quan điểm OO là gì.

Tôi có nên có một đối tượng "searchTagList" có phương pháp cho từng bước được thảo luận ở trên không?

var searchTagList = 
{ 
    searchTagData: JSONdata, 
    renderList: function() { /*send to jTemplates */ } 
    bindEdit: function() { /* attach edit-in-place */ } 
} 

Hoặc điều đó có đúng không? (Có vẻ như tất cả những gì tôi đang làm là gói các hàm thủ tục của tôi trong một đối tượng.) Tôi có nên phân tích cú pháp dữ liệu JSON thành các cá thể của mỗi thẻ tìm kiếm không, sau đó gắn các phương thức riêng lẻ vào mỗi thẻ tìm kiếm? (Điều này có vẻ như rất nhiều chi phí, vì không đạt được.)

Xin lỗi trước nếu có vẻ như tôi đang chọn lông. Nhưng tôi thực sự muốn có được thứ này ngay trong đầu mình.

Cảm ơn,

Travis

Trả lời

2

Trên thực tế, ví dụ jQuery bạn được đăng không procedual, chúng OO. Cụ thể là họ là một thực hiện các đối tượng có thể thay đổi được từ trường Lập trình chất lỏng của thiết kế OO.

Procedual sẽ là một cái gì đó như:

var el = cssQuery("#searchTagList"); 
var templateObject = makeTemplate(el,"template_searchTagList"); 
processTemplate(templateObject,searchTagData); 

chức năng sẽ là một cái gì đó như:

processTemplate(
    makeTemplate(
     cssQuery("#searchTagList"), 
     "template_searchTagList" 
    ), 
    searchTagData 
); 

jQuery đã làm một công việc khá tốt của objectifying API DOM. Bạn có thể sử dụng nó như một nguồn cảm hứng cho thư viện OO DOM của riêng bạn. Một số khác mà tôi khuyên bạn nên xem xét là YUI3 (YUI2 là rất thủ tục).

Cụ thể, mô hình chung của jQuery và YUI3 là:

nodeListConstructor(query_string).nodeMethods(); 

đâu họ xác định một đối tượng nút OO giống như quấn quanh DOM HTMLElements và sau đó một OO đối tượng phong cách NodeList để cho phép bạn các nút xử lý hàng loạt . Điều này trong quan điểm khiêm tốn của tôi là một mẫu thiết kế tốt.

+0

Cảm ơn bạn đã trả lời. Tôi nên làm rõ. Khi tôi có nghĩa là thủ tục, tôi có nghĩa là tôi có 3 chức năng riêng biệt trong không gian toàn cầu. Một để xử lý truy xuất JSON từ máy chủ. Một để chuyển đổi JSON sang html. Và một chức năng cuối cùng để đính kèm một chỉnh sửa tại chỗ phương pháp để các nút html. Đúng là mỗi hàm trong số đó sử dụng các kỹ thuật jQuery của OO trong nội bộ. Nhưng tôi quan tâm nhiều hơn về cách tốt nhất để tổ chức ba hàm mức cao hơn, mà hiện tại trông rất thủ tục - tức là tất cả chúng nên được gói lại với nhau trong một đối tượng. Tôi sẽ xem xét YUI3, cảm ơn. – Travis

1

Bạn có thể sử dụng mẫu Mô-đun Javascript để có hiệu lực tốt tại đây.

Theo mô hình mà định nghĩa searchTagList của bạn sẽ thay đổi để:

var searchTagList = function() { 
    searchTagData: JSONdata; 
    return { 
    renderList: function() { /*send to jTemplates */ }, 
    bindEdit: function() { /* attach edit-in-place */ } 
    }; 
}(); 

Hai chức năng renderList và bindEdit vẫn sẽ có thể truy cập searchTagData nhưng sẽ vẫn không thể tiếp cận để mã mô-đun searchTagList bên ngoài.

Quan sát rằng hàm ẩn danh thực thi ngay lập tức và trả về một đối tượng chứa hai phương thức công khai (renderList và bindEdit) tạo thành một closure trên searchTagData thành viên riêng tư.

Bạn có thể đọc thêm về mẫu Mô-đun here.

+1

Cảm ơn thông tin. Tôi đã chơi xung quanh mô hình mô-đun. Nhưng tôi tìm thấy rất nhanh (không phải trong ví dụ trên nhưng trong mã sản xuất thực tế) mà đôi khi tôi gặp phải các tình huống khi có phương pháp riêng để gọi phương thức công khai - và điều đó không hiệu quả. Có lẽ đó chỉ là thiết kế xấu trên phần của tôi ... :) – Travis

+0

Trong mô hình mô-đun gọi một phương thức công khai từ một phương pháp riêng là không thể bởi vì các thành viên công cộng hình thành một đóng cửa trên các thành viên tư nhân và không phải là cách khác tròn. Điều này chỉ xảy ra với tôi bây giờ và tôi đã không nghĩ về một kịch bản như vậy trước đây. Cảm ơn. – ardsrk

+1

@Travis, nếu bạn cần gọi phương thức công khai từ phương thức riêng, chỉ cần xác định phương thức công khai giống như cách bạn làm phương thức riêng và thêm phương thức đó vào đối tượng được trả về theo tên thay vì làm hàm ẩn danh. –

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