2010-09-29 17 views
8

Có lý do chung nào để không xử lý nguyên mẫu của Tài liệu và Nguyên tố không?Lý do chung không để đối phó với nguyên mẫu của Tài liệu và Nguyên tố

Tôi thích tạo một khung công tác nhỏ của riêng mình, bởi vì dự án hiện tại của tôi không cần khối lượng các tính năng của các khung công tác hiện có.

Tôi không cần hỗ trợ các trình duyệt không hỗ trợ Trình tạo yếu tố/tài liệu và cũng sẽ không thực thi các tập lệnh không nằm trong tầm kiểm soát của tôi.

Vì vậy, bạn có đề nghị mở rộng nguyên mẫu hay tôi nên đi theo cách thông thường và tạo đối tượng riêng từ Phần tử/Tài liệu?

+1

Nó thực sự không rõ ràng những gì bạn đang yêu cầu ở đây. – Robusto

+0

Tôi nói về Element.prototype và Document.prototype (HTMLDocument.prototype). Lý do của việc không sử dụng chúng là gì, nếu có? –

Trả lời

8

Bạn có dự định mở rộng các phần tử DOM mặc định không? Nếu có, xin đừng. Juriy Zaytsev (hay còn gọi là Kangax) mô tả rõ ràng tại sao không ở số What’s wrong with extending the DOM.

+1

Chính xác, đó là những gì tôi đã lên kế hoạch. –

+0

Tôi có thể nghĩ về một số trường hợp rất đặc biệt, khi bạn không thể làm điều này. ví dụ gỡ lỗi một số bằng chứng về các kịch bản khái niệm, những gì sẽ không đi vào sản xuất bao giờ hết. Vì vậy, tôi thấy câu trả lời này không hữu ích. – kisp

6

Có, thật không may. Nó sẽ là đáng yêu để có thể thêm chức năng bằng cách fiddling DOM nguyên mẫu, nhưng trong thực tế nó chỉ là không đáng tin cậy cho công nghệ ngày nay.

Document, Element và các thiết bị khác v.v. có thể là 'đối tượng lưu trữ' được trình duyệt thực hiện mà không có khả năng giả mạo với nguyên mẫu của chúng. Đối tượng lưu trữ có thể có nhiều hành vi lạ khác mà đối tượng JavaScript gốc sẽ không. Các Nút DOM là các đối tượng lưu trữ trong IE6-7 và nhiều trình duyệt cũ hơn, thích hợp và di động.

Ngay cả khi chúng được triển khai dưới dạng đối tượng JavaScript gốc, không có tiêu chuẩn (chưa) mô tả nơi hàm xây dựng cho chúng được tìm thấy, để bạn đi câu cá trong số .prototype. Document, Element và vân vân chỉ là các tên giao diện W3 DOM, chúng không nói gì về những gì các đối tượng triển khai được tìm thấy. Điều này xảy ra là các trình duyệt hiện đại (chế độ gốc IE8 và các phiên bản Firefox, Opera và WebKit gần đây) làm cho hàm dựng sẵn có sẵn để bạn có thể bắt đầu thêm phương thức vào Document hoặc HTMLElement. Nhưng thậm chí sau đó, có sự khác biệt giữa những gì các đối tượng được tiếp xúc, vì không phải mọi trình duyệt đều cung cấp các giao diện DOM với các triển khai dưới cùng một tên. (Các giao diện con/triển khai của NodeList đặc biệt rắc rối.)

Bạn có thể thấy cách tạo mẫu DOM đã hoạt động trong thực tế bằng cách xem khuôn khổ Prototype.js. Khi nó hoạt động, nó siêu mịn. Nhưng bởi vì bạn không thể thử nghiệm ở khắp mọi nơi, bạn kết thúc với một số thứ cực kỳ xấu xí mà khung công tác phải đối phó với các địa điểm tạo mẫu sẽ không hoạt động bằng cách sao chép các phương thức vào mọi thể hiện của nút. Và sau đó bạn đã có tình huống mà mã của bạn có thể quên nó cần phải "tăng cường" này và do đó nó có thể hoạt động hoặc không hoạt động tùy thuộc vào việc một số chức năng khác đã xảy ra để tăng thêm cùng một nút trước đó hay không. Điều này dẫn đến nỗi đau gỡ rối cụ thể về trình duyệt cụ thể, tương tác theo thứ tự cụ thể, điều kiện đua.

Nếu bạn có thể giới hạn công việc tạo mẫu cho một số giao diện được hỗ trợ tốt và từ bỏ tất cả trừ các trình duyệt mới nhất, bạn có thể bỏ qua nó.

+0

Các nút DOM vẫn là đối tượng lưu trữ ngay cả khi các trình duyệt cung cấp một hàm tạo và chuỗi nguyên mẫu. –