11.08.2009, 23:50
|
Профессор
|
|
Регистрация: 18.04.2008
Сообщений: 152
|
|
Zeroglif, да, конечно, расширять, я неверно выразился.
Сообщение от Zeroglif
|
любую мелкую задачу через Object
|
насколько мелкую?
Сообщение от Zeroglif
|
Раздражает прежде всего контроль за именами.
|
Что вы имеете ввиду?
|
|
12.08.2009, 23:31
|
Профессор
|
|
Регистрация: 18.04.2008
Сообщений: 152
|
|
В общем, как всегда на этом форуме, — получил кучу очевидных ответов и туманных общих замечаний, и ничего нового. Печально, господа.
Неужели мы тут только для того, чтобы высокомерно отвечать новичкам, которые не то что JS, русского языка-то не знают?
|
|
12.08.2009, 23:45
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
hogart, почему туманных? Здесь были и конкретные ответы/советы. Можно ещё раз:
Сообщение от hogart
|
Действительно ли плохо менять встроенные прототипы?
|
Нет, не плохо, к тому же - заложено в идеологию языка. JS - динамический язык.
Сообщение от hogart
|
Чем это плохо, кроме того, что возможно, при подключении еще одного фреймворка, возникнут конфликты?
Какие подводные камни?
|
Подводные камни:
- конфликт имён (подключение нескольких библиотек, но здесь - не важно - в прототипе описано или нет - в двух фреймворках может быть и две глобальные переменные, как, например, $);
- в идеале, нужна документация для других программистов;
- расширять Object.prototype не следует;
- расширять Array.prototype можно, но тогда будет ограничение на итерацию по массивам через for ... in (либо, использовать в паре с .hasOwnProperty, либо "индексный" цикл (for var k = 0; k < .. ; k++), либо методы типа .forEach).
Что смущает?
Последний раз редактировалось Dmitry A. Soshnikov, 12.08.2009 в 23:51.
|
|
13.08.2009, 00:03
|
Профессор
|
|
Регистрация: 18.04.2008
Сообщений: 152
|
|
Dmitry A. Soshnikov, ага, вот это уже лучше. Давайте обсудим.
Сообщение от Dmitry A. Soshnikov
|
Нет, не плохо, к тому же - заложено в идеологию языка. JS - динамический язык.
|
Ок, согласен.
Но, например, Python — тоже динамический язык, и в нем точно так же можно дополнять/менять поведение встроенных типов, но там это считается дурным тоном — и есть типы, аналогичные встроенным, но предназначенные для наследования/переопределения.
Сообщение от Dmitry A. Soshnikov
|
- в идеале, нужна документация для других программистов;
|
в идеале она нужна (читай «должна быть») всегда (и это одна из тех очевидных вещей, о которых я говорил). В идеале, видя коммит без комментов, я должен пойти и дать по шапке за такое.
Сообщение от Dmitry A. Soshnikov
|
- расширять Array.prototype можно, но тогда будет ограничение на итерацию по массивам через for ... in (либо, использовать в паре с .hasOwnProperty).
|
Не могу себе представить, зачем бы мне понадобилось итерировать по массивам через for..in.
|
|
13.08.2009, 00:16
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от hogart
|
Но, например, Python — тоже динамический язык, и в нем точно так же можно дополнять/менять поведение встроенных типов, но там это считается дурным тоном — и есть типы, аналогичные встроенным, но предназначенные для наследования/переопределения.
|
Да ладно? В Питоне, в отличии от JS (или Ruby), нельзя расширять встроенные классы. Расширьте-ка, object. Или dict. Или ещё что. Наследоваться - это одно, а расширять - другое.
Сообщение от hogart
|
в идеале она нужна (читай «должна быть»)
|
Я отметил в плане "подводных камней". Если будет метод массива [].last(), кто-нибудь (пришедший, например, из статических языков) может подумать, что это стандартный метод и потом использует в другом проекте, где никакого .last уже не будет. С другой стороны, если известны стандартные методы, можно сразу определить, что это - расширение.
Сообщение от hogart
|
Не могу себе представить, зачем бы мне понадобилось итерировать по массивам через for..in.
|
Вы про Питон упомянули? Там Вы for ... in не пользовались?
|
|
13.08.2009, 00:30
|
Профессор
|
|
Регистрация: 18.04.2008
Сообщений: 152
|
|
Сообщение от Dmitry A. Soshnikov
|
нельзя расширять встроенные классы
|
Да, это я не подумавши ляпнул, извините. Хорошо, возьмем не встроенные классы, а встроенные функции.
И опять таки — расширение встроенных классов запрещено на уровне языка. Хотя большинство питонистов все-таки более сознательны, чем люди, приходящие в JS.
Сообщение от Dmitry A. Soshnikov
|
кто-нибудь (пришедший, например, из статических языков)
|
какая-то очень эфемерная опасность. Нужно найти еще сишника, который не прочтет мануалы, перед тем как писать на неизвестном языке — а такие не выживают
Сообщение от Dmitry A. Soshnikov
|
Вы про Питон упомянули? Там Вы for ... in не пользовались?
|
А там есть for (i = 0; i < 10; i++)?
|
|
13.08.2009, 01:41
|
|
|
Регистрация: 21.02.2008
Сообщений: 1,250
|
|
hogart,
Я, например, не вижу задач, которые бы рационально было решать с помощью расширения прототипов встроенных объектов. Ну, возможно, кроме маленьких вспомогательных методов, вроде last(), или методов для обеспечения кросс-браузерности.
Я бы не хотел встретиться в коде с такой конструкцией:
var a = [];
a.loadDOMNodes("div.someclass");
Даже если будет один фреймворк в проекте.
|
|
13.08.2009, 11:34
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от 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 относится (но это уже, конечно, мифический случай)?
Последний раз редактировалось Dmitry A. Soshnikov, 13.08.2009 в 11:39.
|
|
13.08.2009, 11:57
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от Dmitry A. Soshnikov
|
индексный цикл или .forEach (нежели, естественно, for...in и .hasOwnProperty).
|
И все три способа в общем случае дадут разный результат.
|
|
13.08.2009, 12:39
|
Профессор
|
|
Регистрация: 18.04.2008
Сообщений: 152
|
|
Сообщение от Dmitry A. Soshnikov
|
Нет, там нет такого цикла.
|
Вот именно.
|
|
|
|