Tôi đọc ở đâu đó sử dụng prototype
để mở rộng đối tượng gốc (String
, Number
, Array
, v.v.) là một ý tưởng tồi. Điều này có đúng không? Tại sao hay tại sao không?Đang sử dụng Prototype để mở rộng đối tượng gốc có bị hỏng không?
Trả lời
Tôi không nghĩ nó xấu. Nếu bạn có một cái nhìn về Ruby on Rails, rất nhiều đối tượng bản địa được mở rộng với chức năng tùy chỉnh và đó là một khung công tác rất tốt.
Điều gì sẽ là xấu nếu bạn thay đổi phương thức hiện có trên đối tượng gốc. điều này có thể gây hậu quả không tốt.
Ah, được rồi. Vâng, điều đó sẽ có ý nghĩa. –
Tôi sẽ tránh việc mở rộng/sửa đổi hành vi của các đối tượng gốc.
Ít nhất cũng có ý nghĩa khi phát triển trong môi trường nhóm. Đơn giản chỉ vì, vài tháng sau, một nhà phát triển khác viết một đoạn mã độc lập khác sẽ không nhận ra hành vi đã thay đổi trừ khi được ghi lại ở đâu đó và nhận thức được nó trước khi bắt đầu nhiệm vụ của mình.
Thay vào đó, tôi đề xuất đóng gói/"không gian tên" - tất cả các chức năng như vậy để ai đó có thể chọn hoặc không sử dụng các chức năng đã sửa đổi.
Ngoài ra, các đối tượng gốc và các phương pháp của chúng được kiểm tra kỹ lưỡng cho các trường hợp khác nhau. Vì vậy, bạn sẽ phải hoàn toàn chắc chắn về những gì bạn đang làm trước khi sửa đổi chức năng gốc.
Có một cuộc thảo luận tuyệt vời về điều này trong video này từ JSConf 2011 của Andrew Dupont. http://blip.tv/jsconf/jsconf2011-andrew-dupont-everything-is-permitted-extending-built-ins-5211542
Về cơ bản các điểm là:
- Đừng mở rộng
Object.prototype
- Một số người có thể muốn mở rộng sự vật, một số người không
- Bạn cần phải biết những gì bạn đang làm
- Không sử dụng hai thư viện mở rộng mọi thứ, bởi vì nó có thể xấu
- Mở rộng các mẫu thử để thêm chức năng tiêu chuẩn hầu như luôn ổn.
- 1. Prototype có thể mở rộng các phần tử SVG không?
- 2. javascript prototype mở rộng phương pháp
- 3. Làm cách nào để có phương pháp mở rộng thay đổi đối tượng gốc?
- 4. Tôi có thể mở rộng Corona bằng mã gốc không?
- 5. Cách mở rộng đối tượng mảng trong javascript
- 6. Máy phát mã có bị hỏng không?
- 7. Trả lại đối tượng PHP "Gốc" từ Tiện ích mở rộng
- 8. Vòng lặp có bị hỏng không?
- 9. AS3 sử dụng ma trận để "mở rộng" đối tượng từ "trung tâm"
- 10. Làm thế nào để mở rộng một đối tượng hiện có trong C# 4.0 bằng cách sử dụng động lực
- 11. Nguyên mẫu đối tượng gốc Mootools/Prototype yêu thích của bạn là gì?
- 12. Làm cách nào để mở rộng đối tượng javascript?
- 13. Bạn có đang sử dụng Tiện ích mở rộng song song không?
- 14. Mở rộng ký tự đại diện bị hỏng cho dòng lệnh Java7 trên Windows (7?)
- 15. Tôi có thể sử dụng Terracotta để mở rộng ứng dụng chuyên sâu RAM không?
- 16. Cập nhật Gem trên Windows - có bị hỏng không?
- 17. Sử dụng Haskell để mở rộng Perl?
- 18. Mở rộng Eta - tên gốc
- 19. Có cách nào để sử dụng phương pháp mở rộng trong khối khởi tạo đối tượng trong C#
- 20. Hình ảnh trung tâm của Gạch "bán mở rộng" bị hỏng
- 21. Mở rộng các thuộc tính của các đối tượng hiện có như Date in TypeScript
- 22. Sử dụng Robocopy để loại trừ phần mở rộng tập tin khỏi thư mục gốc
- 23. NHibernate FetchMany có nhiều hơn hai bảng bị hỏng không?
- 24. IKImageView khiến ứng dụng bị hỏng
- 25. Tại sao sử dụng Object.create cho mẫu thử nghiệm khi mở rộng một đối tượng?
- 26. Mở rộng nhà máy đối tượng tùy chỉnh cho Unity
- 27. RABL: đối tượng JSON mà không có gốc chính
- 28. Sử dụng Autolayout với mở rộng NSTextViews
- 29. Mã Mono C# bị hỏng bằng cách sử dụng System.Windows.Forms
- 30. Có phải đối tượng chế nhạo được sử dụng rộng rãi không?
Đây là câu hỏi hoàn toàn hợp lệ về một số giá trị, imo. Nó không nên đóng lại. –
http://stackoverflow.com/faq#dontask nói rằng nó không phải là. – vascowhite
Về cơ bản, một dup http://stackoverflow.com/questions/8859828/javascript-what-dangers-are-in-extending-array-prototype/8859941#8859941 –