Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Расширение прототипов встроенных обьектов: хорошо или плохо? (https://javascript.ru/forum/misc/4646-rasshirenie-prototipov-vstroennykh-obektov-khorosho-ili-plokho.html)

Андрей Параничев 10.08.2009 23:17

А вот мне кажется, что расширение прототипов встроенных объектов только вводит путаницу в код.

Dmitry A. Soshnikov 10.08.2009 23:22

Цитата:

Сообщение от Kolyaj
А по массивам не надо бегать for-in

Я в курсе ;) А вообще - почему "не надо"?

Цитата:

Сообщение от Андрей Параничев
А вот мне кажется, что расширение прототипов встроенных объектов только вводит путаницу в код.

Возможно, но, если пишется локальный фреймворк - почему нет? Если популярный фреймворк для общего использования и есть соответствующая документация - почему нет? Monkey patch - вполне удобная практика в динамических языках.

Kolyaj 10.08.2009 23:26

Ну тут сначала нужно разделить случаи. Первый -- это нивелирование различий браузеров: тот же forEach (да и остальные методы, кроме reduce-reduceRight) везде есть, в ИЕ нет. Второй случай -- добавление своих методов. Тут я тоже не вижу путаницы. Простой и полезный метод last, например,
var lastElem = getMyArray().last();
Где тут путаница?

Вот если бы вопрос стоял "Расширять ли прототипы во фреймворках?", тогда можно подумать, но в каждом случае отдельно, в зависимости от его целей и задач.

Андрей Параничев 10.08.2009 23:41

Kolyaj,
Я бы реализовал функцию last(), а не метод в прототипе. Чтобы у других программистов не возникало вопросов при просмотре, например, такого кода:
var myArray = ["some", "thing", "here"];
doSomething(myArray.last())

Тут может быть непрозрачно, откуда взялся этот ласт. Но пример утрирован, конечно.

Может я и не прав, но думаю, что нужно локализовать свой код так, чтоб он не трогал глобальную область видимости и прототипы встроенных объектов (что тоже, по сути, глобально).

Kolyaj 10.08.2009 23:49

Цитата:

Сообщение от Андрей Параничев
откуда взялся этот ласт

Оттуда же, откуда взялась бы функция. Ты ведь знаешь стандартные методы Array? Знаешь, что там нет last? Значит он где-то в проекте реализован. Значит можно кликнуть колесиком и перейти к реализации ))) Мы ведь, надеюсь, не говорим о тех, кто не знает JavaScript? А если ты не знаешь JS, значит ты не можешь быть уверен, откуда взялась и функция last.

Цитата:

Сообщение от Андрей Параничев
Я бы реализовал функцию last()

Вложенный вызов функций читается хуже цепочки методов.

hogart 11.08.2009 19:59

Цитата:

Сообщение от Kolyaj
А какие еще могут возникнуть проблемы?

Вот я и спрашиваю, какие еще могут возникнуть проблемы?:)

hogart 11.08.2009 20:03

Цитата:

Сообщение от Андрей Параничев
Может я и не прав, но думаю, что нужно локализовать свой код так, чтоб он не трогал глобальную область видимости и прототипы встроенных объектов (что тоже, по сути, глобально).

Почему, почему, почему? Ведь очевидно, что две библиотеки подключают только очень небрежные люди.

Kolyaj 11.08.2009 20:28

Цитата:

Сообщение от hogart
Вот я и спрашиваю, какие еще могут возникнуть проблемы?

Ну тогда лично я не вижу проблем :)

hogart 11.08.2009 20:30

Kolyaj, я, вроде бы, тоже. Но не хочется опираться только на собственную самоуверенность в таком достаточно фундаментальном вопросе:)

Zeroglif 11.08.2009 22:26

Цитата:

Сообщение от hogart (Сообщение 26378)
1) Действительно ли плохо менять встроенные прототипы?

2) Чем это плохо, кроме того, что возможно, при подключении еще одного фреймворка, возникнут конфликты?

3) Какие подводные камни?

1) 2) 3) Наверное не "менять прототипы", а расширять прототипы. Удобное, компактное расширение - идея прототипов, это хорошо. Плохо, когда причиной расширения становится не реюз и компактность, а "типа-объектное-программирование-чтоб-было" - любую мелкую задачу через Object. Раздражает прежде всего контроль за именами.


Часовой пояс GMT +3, время: 18:10.