Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 11.08.2009, 23:50
Профессор
Отправить личное сообщение для hogart Посмотреть профиль Найти все сообщения от hogart
 
Регистрация: 18.04.2008
Сообщений: 152

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

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

Сообщение от Zeroglif
Раздражает прежде всего контроль за именами.
Что вы имеете ввиду?
Ответить с цитированием
  #22 (permalink)  
Старый 12.08.2009, 23:31
Профессор
Отправить личное сообщение для hogart Посмотреть профиль Найти все сообщения от hogart
 
Регистрация: 18.04.2008
Сообщений: 152

В общем, как всегда на этом форуме, — получил кучу очевидных ответов и туманных общих замечаний, и ничего нового. Печально, господа.
Неужели мы тут только для того, чтобы высокомерно отвечать новичкам, которые не то что JS, русского языка-то не знают?
Ответить с цитированием
  #23 (permalink)  
Старый 12.08.2009, 23:45
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

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

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

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

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

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

Что смущает?
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 12.08.2009 в 23:51.
Ответить с цитированием
  #24 (permalink)  
Старый 13.08.2009, 00:03
Профессор
Отправить личное сообщение для hogart Посмотреть профиль Найти все сообщения от hogart
 
Регистрация: 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.
Ответить с цитированием
  #25 (permalink)  
Старый 13.08.2009, 00:16
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от hogart
Но, например, Python — тоже динамический язык, и в нем точно так же можно дополнять/менять поведение встроенных типов, но там это считается дурным тоном — и есть типы, аналогичные встроенным, но предназначенные для наследования/переопределения.
Да ладно? В Питоне, в отличии от JS (или Ruby), нельзя расширять встроенные классы. Расширьте-ка, object. Или dict. Или ещё что. Наследоваться - это одно, а расширять - другое.

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

Сообщение от hogart
Не могу себе представить, зачем бы мне понадобилось итерировать по массивам через for..in.
Вы про Питон упомянули? Там Вы for ... in не пользовались?
__________________
Тонкости ECMAScript
Ответить с цитированием
  #26 (permalink)  
Старый 13.08.2009, 00:30
Профессор
Отправить личное сообщение для hogart Посмотреть профиль Найти все сообщения от hogart
 
Регистрация: 18.04.2008
Сообщений: 152

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

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

Сообщение от Dmitry A. Soshnikov
Вы про Питон упомянули? Там Вы for ... in не пользовались?
А там есть for (i = 0; i < 10; i++)?
Ответить с цитированием
  #27 (permalink)  
Старый 13.08.2009, 01:41
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

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

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

Даже если будет один фреймворк в проекте.
Ответить с цитированием
  #28 (permalink)  
Старый 13.08.2009, 11:34
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 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 относится (но это уже, конечно, мифический случай)?
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 13.08.2009 в 11:39.
Ответить с цитированием
  #29 (permalink)  
Старый 13.08.2009, 11:57
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Dmitry A. Soshnikov
индексный цикл или .forEach (нежели, естественно, for...in и .hasOwnProperty).
И все три способа в общем случае дадут разный результат.
Ответить с цитированием
  #30 (permalink)  
Старый 13.08.2009, 12:39
Профессор
Отправить личное сообщение для hogart Посмотреть профиль Найти все сообщения от hogart
 
Регистрация: 18.04.2008
Сообщений: 152

Сообщение от Dmitry A. Soshnikov
Нет, там нет такого цикла.
Вот именно.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск