Расширение нативных элементов в JavaScript через прототип?

Считаете ли вы расширение нативных элементов через прототип опасным? Я вижу, что некоторые фреймворки, такие как Prototype, делают это, поэтому я начал задаваться вопросом, осмелюсь ли я сделать это тоже.

Я беспокоюсь о реализации таких вещей, как addClassName, и о том, чтобы они столкнулись в будущем таким образом, что я не могу решить никаким другим способом, кроме как переписать программное обеспечение и попросить авторов модулей сделать то же самое.


person Tower    schedule 26.08.2010    source источник
comment
Возможный дубликат stackoverflow .com/questions/14034180/   -  person Neil    schedule 25.02.2018
comment
Возможный дубликат Почему расширение нативных объектов является плохой практикой?   -  person WD40    schedule 30.04.2019


Ответы (1)


Я бы не стал, потому что, ИМХО, рано или поздно это определенно может привести к коллизиям и создать потенциальную ошибку, которую очень трудно обнаружить.

В любом случае я расширяю некоторые базовые простые нативные объекты Javascript, такие как String.trim, я всегда стараюсь проверить, существует ли он уже, используя простой тест if:

if(!String.prototype.trim)
   String.prototype.trim = function() { return this.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); }

Вы можете сделать то же самое с addClassName. Разница в том, что делать это с помощью простой функции, такой как String.trim, сложно, что может привести к проблемам в будущем, потому что даже если в движке браузера есть String.trim (на самом деле он есть в FF), такая функция точно будет делать что делает мой String.trim, поэтому вы никогда не увидите различий в рабочем процессе вашего веб-приложения.

Более сложная функция, такая как переопределение querySelectorAll, может привести к различиям между тем, как ее реализует браузер, и вашей реализацией. Например: порядок возвращаемых элементов может быть другим, функция браузера возвращает коллекцию, а ваша — массив и другие проблемы. Поэтому, когда вы запускаете свое веб-приложение в браузере, который реализует querySelectorAll, это может привести к тому, что ваше веб-приложение больше не будет работать должным образом, и попробуйте найти ошибку !!!

Возможно, querySelectorAll — не лучший пример, но я надеюсь, что объяснил концепцию.

person Marco Demaio    schedule 26.08.2010