2010-09-25 24 views
10

Khi làm việc, chúng tôi sử dụng jQuery. Ngay sau khi chúng tôi bắt đầu sử dụng nó, tôi thấy rằng một vài nhà phát triển đã thêm các hàm vào một tệp jquery-extensions.js. Bên trong, tôi tìm thấy một bó toàn bộ các phương thức được thêm vào $ về cơ bản là số tiền cho các phương thức tĩnh trên jQuery. Dưới đây là một vài ví dụ:

$.formatString(str, args) { 
    ... 
} 

$.objectToArray(obj) { 
    ... 
} 

vv Không ai trong số họ thực sự sử dụng bất cứ điều gì để làm với jQuery. Điều này làm tôi kinh ngạc.

Cuối cùng, chúng tôi cần một hàm trong thư viện của chúng tôi để bản địa hóa ngày tháng. Giải pháp của tôi là tạo ra:

Date.prototype.toLocaleDate = function() { 
    ... 
} 

Date.parseLocalDate = function() { 
    ... 
} 

Ngay sau khi làm điều này, tôi nhận được một nhà phát triển Sr sắp tới chỗ tôi hỏi tôi những gì tôi nghĩ tôi đang làm. Anh ấy nói với tôi rằng ở đây, nơi tôi làm việc, chúng tôi không tạo ra nguyên mẫu vì chúng là ác. Lý do duy nhất ông đưa ra là họ về cơ bản là một tính năng ngôn ngữ nghèo bởi vì họ "có thể bị lạm dụng" và rằng nó khó hiểu để xem nguyên mẫu (ví dụ như làm thế nào để tôi biết Date mới(). ToLocaleDate() là một nguyên mẫu và không phải bản địa ECMAScript). Bằng cách sử dụng $.formatString(...) thay vì "blah blah".formatString(...), chúng tôi lưu ý rằng bất kỳ điều gì có $ đều không phải là một phần của JavaScript gốc.

Những lý do có vẻ hơi ngớ ngẩn, nhưng tôi đề nghị một thỏa hiệp để anh không phải nhớ dù một phương pháp là một nguyên mẫu — tiền tố tên hàm nguyên mẫu với $:

String.prototype.$format = function() { 
    ... 
} 

"blah blah".$format(...); 

này đã nhanh chóng bị sa thải và bây giờ tôi phải thêm các hàm $ .myPrototypeAsAFauxStaticMethodOnjQuery() này ở mọi nơi.

Tôi có phải là người duy nhất nghĩ rằng thực hành này là ngu ngốc không?

+3

Họ chỉ muốn '$', nếu bạn bị trôi dạt. – BoltClock

+0

"Tôi là người duy nhất nghĩ rằng thực hành này là ngu ngốc?" Không. Nhưng ... ** làm ** biến nó thành Wiki Cộng đồng hoặc nó sẽ bị đóng. Tốt hơn, hãy hỏi điều này trên http://programmers.stackexchange.com –

+0

@Kirk Woll: yêu cầu đại diện cho việc tạo bài đăng của riêng CW là gì? (Tôi biết 100 là cần thiết để chỉnh sửa bài viết CW khác.) – BoltClock

Trả lời

3

Cuộc tranh luận nguyên mẫu có chút mệt mỏi, có điểm hợp lệ ở cả hai bên, tôi sẽ cố gắng tóm tắt chúng với hy vọng có thể hữu ích khi thấy bức tranh lớn.

contra Không cần phải mở rộng nguyên mẫu gốc. Bạn có mọi thứ bạn cần.
pro Thư viện chuẩn JS khan hiếm đến mức cực đoan. Mảng và chuỗi thiếu nhiều tính năng quan trọng.

contra Sử dụng chức năng hoặc "không gian tên" của riêng bạn.
pro Các phương pháp như foo.trim() có ý nghĩa hơn về tinh thần của ngôn ngữ so với các chức năng như org.blah.trim(foo). Tất cả mọi thứ là đối tượng trong javascript và để cho nó được như vậy.

contra Đối tượng JS gốc được "dành riêng" cho các nhà thiết kế ngôn ngữ. Các phương pháp của chúng tôi có thể vô tình ghi đè các bản dựng sẵn mới được thêm vào.
pro Đối tượng mở là một tính năng tuyệt vời và thật ngớ ngẩn khi không sử dụng nó. Một phiên bản Javascript mới không phải là một cái gì đó xảy ra mỗi ngày và bổ sung cho các tiêu chuẩn được biết đến trước.

contra Mở rộng nguyên mẫu gốc gây nhầm lẫn, vì không có sự phân biệt giữa phương pháp của chúng tôi và gốc.
pro Thư viện chuẩn JS là tài liệu nhỏ và được tài liệu hóa tốt. Chúng tôi phát triển javascript có nghĩa vụ phải biết tên của phương thức gốc.

contra Mở rộng nguyên mẫu có thể dẫn đến xung đột không gian tên.
pro Có, nhưng điều này có thể xảy ra với các chức năng toàn cầu hoặc các đối tượng toàn cầu nổi tiếng (như $).

contra Phương thức tùy chỉnh được liệt kê.
pro Có, nhưng có hasOwnProperty để giải cứu. Quấn nó vào chức năng đếm số của riêng bạn và ngừng sử dụng các vòng for..in thô với các đối tượng.

(không phải là một câu trả lời thực tế, do đó CW)

+0

+1 câu trả lời hay! Mặc dù câu hỏi cũ của nó :) – Sergio

1
  1. Tiêu đề cao cấp thường bị đánh giá quá cao.
  2. Có rất nhiều người không hiểu thừa kế nguyên mẫu.
  3. Mặc dù mở rộng nguyên mẫu của các đối tượng JavaScript gốc là hợp pháp, nhưng đừng làm điều đó. Bạn có nguy cơ xung đột với các khung công tác.
  4. Sẽ không có ý nghĩa nếu chiếm đoạt $ cho các chức năng tiện ích không phải jQuery. Tại sao không sử dụng không gian tên riêng của công ty? Nếu bạn cần súc tích, hãy sử dụng $$ v.v.
0

Tôi nghĩ rằng nó không phải là ngu ngốc !, Nhưng Nó đẹp hơn để sử dụng nguyên mẫu !, Nhưng sau đó một lần nữa những người quan tâm về vẻ đẹp? Mã của bạn cuối cùng sẽ đáng sợ và will suck, Nhưng nếu nó được ghi lại và nhất quán bạn sẽ không bao giờ cần phải suy nghĩ về những vấn đề này!

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