Я считаю, что этот вопрос заслуживает обновленного ES6 ответа.
ES5
Прежде всего, как уже говорили многие люди. Расширение нативных прототипов для добавления новых стандартов или исправления ошибок или исправления ошибок является стандартной практикой и не наносит вреда. Например, если браузер не поддерживает метод .filter if (!Array.prototype.filter)
, вы можете добавить эту функцию самостоятельно. Фактически, язык предназначен именно для этого, чтобы управлять обратной совместимостью.
Теперь вы бы простились за то, что, поскольку объект JavaScript использует наследование прототипов, расширение нативного объекта, такого как Array.prototype
, без вмешательства должно быть легким, но до ES6 это было невозможно.
В отличие от объектов, например, вам пришлось положиться и изменить Array.prototype
, чтобы добавить свои собственные пользовательские методы. Как уже отмечали другие, это плохо , поскольку оно загрязняет глобальное пространство имен, может неожиданно мешать другому коду, имеет потенциальные проблемы с безопасностью, является основным грехом и т. Д.
В ES5 вы можете попробовать взломать это, но реализации на самом деле практически бесполезны. Для получения более подробной информации, я рекомендую вам прочитать этот очень информативный пост: http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/
Вы можете добавить метод в массив или даже конструктор массива, но вы столкнетесь с проблемами, пытаясь работать с собственными методами массива, которые полагаются на свойство length. Хуже всего то, что эти методы будут возвращать нативный Array.prototype
, а не ваш новый блестящий массив подклассов, а именно: subClassArray.slice(0) instanceof subClassArray === false
.
ES6
Однако теперь с ES6 вы можете создавать подклассы встроенных классов, используя class
в сочетании с extends Array
, что позволяет решить все эти проблемы. Он оставляет Array.prototype
нетронутым, создает новый подкласс, и методы массива, которые он наследует, будут из того же подкласса! https://hacks.mozilla.org/2015/08/es6-in-depth-subclassing/
См. Скрипку ниже для демонстрации:
https://jsfiddle.net/dmq8o0q4/1/