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)

hogart 11.08.2009 23:50

Zeroglif, да, конечно, расширять, я неверно выразился.

Цитата:

Сообщение от Zeroglif
любую мелкую задачу через Object

насколько мелкую?

Цитата:

Сообщение от Zeroglif
Раздражает прежде всего контроль за именами.

Что вы имеете ввиду?

hogart 12.08.2009 23:31

В общем, как всегда на этом форуме, — получил кучу очевидных ответов и туманных общих замечаний, и ничего нового. Печально, господа.
Неужели мы тут только для того, чтобы высокомерно отвечать новичкам, которые не то что JS, русского языка-то не знают?

Dmitry A. Soshnikov 12.08.2009 23:45

hogart, почему туманных? Здесь были и конкретные ответы/советы. Можно ещё раз:

Цитата:

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

Нет, не плохо, к тому же - заложено в идеологию языка. JS - динамический язык.

Цитата:

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

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

Подводные камни:

- конфликт имён (подключение нескольких библиотек, но здесь - не важно - в прототипе описано или нет - в двух фреймворках может быть и две глобальные переменные, как, например, $);
- в идеале, нужна документация для других программистов;
- расширять Object.prototype не следует;
- расширять Array.prototype можно, но тогда будет ограничение на итерацию по массивам через for ... in (либо, использовать в паре с .hasOwnProperty, либо "индексный" цикл (for var k = 0; k < .. ; k++), либо методы типа .forEach).

Что смущает?

hogart 13.08.2009 00:03

Dmitry A. Soshnikov, ага, вот это уже лучше. Давайте обсудим.

Цитата:

Сообщение от Dmitry A. Soshnikov
Нет, не плохо, к тому же - заложено в идеологию языка. JS - динамический язык.

Ок, согласен.
Но, например, Python — тоже динамический язык, и в нем точно так же можно дополнять/менять поведение встроенных типов, но там это считается дурным тоном — и есть типы, аналогичные встроенным, но предназначенные для наследования/переопределения.

Цитата:

Сообщение от Dmitry A. Soshnikov
- в идеале, нужна документация для других программистов;

в идеале она нужна (читай «должна быть») всегда (и это одна из тех очевидных вещей, о которых я говорил). В идеале, видя коммит без комментов, я должен пойти и дать по шапке за такое.

Цитата:

Сообщение от Dmitry A. Soshnikov
- расширять Array.prototype можно, но тогда будет ограничение на итерацию по массивам через for ... in (либо, использовать в паре с .hasOwnProperty).

Не могу себе представить, зачем бы мне понадобилось итерировать по массивам через for..in.

Dmitry A. Soshnikov 13.08.2009 00:16

Цитата:

Сообщение от hogart
Но, например, Python — тоже динамический язык, и в нем точно так же можно дополнять/менять поведение встроенных типов, но там это считается дурным тоном — и есть типы, аналогичные встроенным, но предназначенные для наследования/переопределения.

Да ладно? В Питоне, в отличии от JS (или Ruby), нельзя расширять встроенные классы. Расширьте-ка, object. Или dict. Или ещё что. Наследоваться - это одно, а расширять - другое.

Цитата:

Сообщение от hogart
в идеале она нужна (читай «должна быть»)

Я отметил в плане "подводных камней". Если будет метод массива [].last(), кто-нибудь (пришедший, например, из статических языков) может подумать, что это стандартный метод и потом использует в другом проекте, где никакого .last уже не будет. С другой стороны, если известны стандартные методы, можно сразу определить, что это - расширение.

Цитата:

Сообщение от hogart
Не могу себе представить, зачем бы мне понадобилось итерировать по массивам через for..in.

Вы про Питон упомянули? Там Вы for ... in не пользовались? ;)

hogart 13.08.2009 00:30

Цитата:

Сообщение от Dmitry A. Soshnikov
нельзя расширять встроенные классы

Да, это я не подумавши ляпнул, извините. Хорошо, возьмем не встроенные классы, а встроенные функции.
И опять таки — расширение встроенных классов запрещено на уровне языка. Хотя большинство питонистов все-таки более сознательны, чем люди, приходящие в JS.

Цитата:

Сообщение от Dmitry A. Soshnikov
кто-нибудь (пришедший, например, из статических языков)

какая-то очень эфемерная опасность. Нужно найти еще сишника, который не прочтет мануалы, перед тем как писать на неизвестном языке — а такие не выживают:)

Цитата:

Сообщение от Dmitry A. Soshnikov
Вы про Питон упомянули? Там Вы for ... in не пользовались?

А там есть for (i = 0; i < 10; i++)?

Андрей Параничев 13.08.2009 01:41

hogart,
Я, например, не вижу задач, которые бы рационально было решать с помощью расширения прототипов встроенных объектов. Ну, возможно, кроме маленьких вспомогательных методов, вроде last(), или методов для обеспечения кросс-браузерности.

Я бы не хотел встретиться в коде с такой конструкцией:
var a = [];
a.loadDOMNodes("div.someclass");

Даже если будет один фреймворк в проекте.

Dmitry A. Soshnikov 13.08.2009 11:34

Цитата:

Сообщение от hogart
Хорошо, возьмем не встроенные классы, а встроенные функции

А что с ними "не так"? Их можно "расширить"?

Цитата:

Сообщение от hogart
И опять таки — расширение встроенных классов запрещено на уровне языка

Всего лишь - одна из реализаций. А в JS и Ruby - не запрещено, и что?

Цитата:

Сообщение от hogart
А там есть for (i = 0; i < 10; i++)?

Нет, там нет такого цикла. Кстати сказать, если расширен Array.prototype, я использую индексный цикл или .forEach (нежели, естественно, for...in и .hasOwnProperty).

И ещё, в JS (с версии 1.7) достпен Array comprehensions (который позаимствован из Питона), и там используется синтаксис for / for each ... in:

var evens = [i for each (i in [1, 2, 3, 4]) if (i % 2 == 0)];


Андрей Параничев, мне кажется, вторая запись более наглядна, определяет сразу принадлежность метода, нежели первая, глобальная функция:

- removeFromArray(array, object);
- array.remove(object);

А если, ещё назовут не removeFromArray а просто remove - думай потом, к чему этот remove относится (но это уже, конечно, мифический случай)?

Kolyaj 13.08.2009 11:57

Цитата:

Сообщение от Dmitry A. Soshnikov
индексный цикл или .forEach (нежели, естественно, for...in и .hasOwnProperty).

И все три способа в общем случае дадут разный результат.

hogart 13.08.2009 12:39

Цитата:

Сообщение от Dmitry A. Soshnikov
Нет, там нет такого цикла.

Вот именно.


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