Расширение нативных элементов в JavaScript через прототип? - PullRequest
2 голосов
/ 26 августа 2010

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

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

1 Ответ

2 голосов
/ 26 августа 2010

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

В любом случае я расширяю некоторые базовые простые нативные объекты 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 не лучший пример, но я надеюсь, что я объяснил концепцию.

...