| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Обсуждение темы о "прототипах" |
| Автор: Sardar 30.4.2005, 23:42 |
| Здесь можно выражать спасибы, а также спрашивать что не ясно. Делать заявки на другие темы и аспекты JS. Впрочем я сам буду постепенно выкладывать "подноготную" |
| Автор: Aliance 1.5.2005, 20:27 |
| Браво |
| Автор: Aliance 22.5.2005, 20:05 | ||
Объясни, зачем вот это:
в первом посте... Оно ж ничего не делает... |
| Автор: Sardar 22.5.2005, 20:52 |
| Это пример, что функция это обьект, как любая другая переменная. Это трудно усвоить например людям пришедшим из C. Неужели кто то решил таки прочесть сие Какюсь, ещё не дописал, даже примеров из жизни не привёл, всё потом... |
| Автор: Aliance 22.5.2005, 21:12 | ||
| Ясно-понятно. Я это хорошо понимаю, значит пропускаем Во втором посте в самом первом коде, почему вот это
выдает 2, а не 0? да я в первый же день прочитал ее, очень хорошая статья. вот теперь осмысливаю, разбираюсь.. |
| Автор: Sardar 22.5.2005, 22:05 | ||
Потому что при вызове функции, не важно как конструктор или как просто функция, создаётся вложенная функция, ссылка на которую присваивается переменной а. Вложенная функция наследует контекст, в котором определенна переменная parg, содержащая ссылку на список аргументов "родительской функции". Другими словами новая функция содержит "вызов" родительской функции и имеет список всех переменных доступных из контекста в момент вызова. При каждом новом вызове "родительской функции" создаётся новая функция, записываемая в а, при вызове функция показывет сколько аргументов было у родителя в момент его вызова. Попробуй написать пару тестов, сразу поймёшь суть |
| Автор: Aliance 22.5.2005, 22:10 |
| Sardar Все время кажется, что нельзя прочитать те значения, которые объявлены после их чтения... Понятно, теперь. Добавлено @ 22:18 Вау, я понял http://forum.vingrad.ru/index.php?showtopic=50738&view=findpost&p=396839 полностью. Я понял что мне было не понятно - функция test - конструктор. Если мы пишем this - мы создаем новое свойство у объекта... а если var - то переменную Теперь собственно буду ждать инфы о собственно-прототипах, спасибо Сардару |
| Автор: Иль 28.5.2005, 18:18 | ||
Выражаю свои СПАСИБЫ. Sardar, спасибо что потрудился и потратил время, хорошо цементирует |
| Автор: Иль 2.6.2005, 20:28 |
| Я не ошибаюсь, что в рекурсии каждый раз создаются новые объекты function? |
| Автор: Sardar 3.6.2005, 00:44 | ||
Иль, ты всё правильно понял потому функция и держит "контекст вызова внешней функции" Другое дело что в конкретной имплементации не обязательно создаёться куча скомпилированного скриптового кода в памяти, контекст передаёться единой функции, что экономит память и работает быстрее. |
| Автор: Иль 3.6.2005, 10:57 | ||
| Sardar, я недопонимаю. Получается что на практике реализация этого объектного подхода в рекурсии или вложенном вызове самой себя через другие функции не работает? Вот смотри, есть функция.caller и есть arguments.callee. Они ж дают ссылки на соответствующие объекты, тогда ж почему в операторе if сравниваются их строковое представление?
Добавлено @ 11:02 Или это из-за специфики работы оператора if |
| Автор: Aliance 16.6.2005, 13:12 |
| ppc. Я наконец-то понл примененеие протопипа в большинстве случаев. Ура, товарищи. Все таки я прочел проф. книгу - понимаю, что до этого нужно "дорости" самостоятельно =) Вот непонятой осталась одна область: Зачем протопипы сущ-ют для функции? |
| Автор: Sardar 17.6.2005, 02:53 | ||
| Иль, нет не их строковое преставление сравниваеться, сравниваються ссылки, если обе переменные ссылаються на один обьект функцию, то они идеентичны. Другое дело что caller вещь весьма магическая, не рекомендуемая к употреблению P.S. ивиняюсь что так поздно отвечаю, потестил, получил результаты что не смог обьяснить, а навязывать свою точку зрения не хотел =)
В смысле зачем? Функция это тоже обьект, следовательно имеет конструктор(Function), следовательно и прототип(Function.prototype). Будешь ли ты это использовать, третий вопрос, но в языке не должно быть исключений если это не необходимо P.S. В Опере 6 обьект Function не существует. В IE обьект event, window и другие DOM0 обьекты не имеют поля constructor. Это конечно верно, это всё синглтоны, но вносит исключения, что не есть гуд. |
| Автор: Aliance 17.6.2005, 12:02 | ||
Так и знал, что ответ будет таким. Я это прекрасно знаю. меня именно интересует применение |
| Автор: Sardar 18.6.2005, 01:04 | ||||
Ну я по натуре человек предсказуемый А применяться это может например чтобы IE5.0 пофиксить, он не поддерживает методов call и apply у функций.
Аналогично пишеться apply. |
| Автор: Aliance 18.6.2005, 18:06 |
| Вот, оно. Лови в репу |
| Автор: o.s.a. 30.7.2005, 10:11 |
| Извините, а скоро будет продолжение? А то очень интересно. |
| Автор: Гость_12345 17.10.2005, 00:59 |
| ЦеННо, но заметил баги в языке интерфейса. Не все слова пишутся с 2 "н". Список замеченных опечаток ниже : ; ) ссылка: http://forum.vingrad.ru/index.php?showtopic=50738 изложенно -> изложено записанны -> записаны вызванна -> вызвана созданна -> создана (3 раза) показанно -> показано |
| Автор: Sardar 17.10.2005, 01:53 |
| Гость_12345 спасибо, исправил. |
| Автор: Greendrake 22.1.2006, 21:52 | ||
| Откопал обалденную презентацию по сабжу, рекомендую её также всем кому интересна обсуждаемая статья http://sbnt.jinr.ru/iris/articles/javascript-titov.ppt По теме: объясните мне плиз вот энтот объектно-прототипный синтаксис, который использовал Котеров в своём JSHttpRequest (привожу "каркас" его кода):
Как-то очень всё хитро. Сначала задаётся название головного объекта - JSHttpRequest, после него - () - типа это функция, затем - {} - типа это объект. А затем всё остальное помещается в скобки ( ..... ), внутри которых (разве так можно??) определён прототип всей этой бандуры. А после них на конце ещё (); Круто блин, тоже так хочу уметь |
| Автор: Greendrake 23.1.2006, 23:55 |
| Zeroglif, спасибо, вроде прояснилось. Не понял, зачем могло понадобиться определять метод dataReady сначала напрямую - JSHttpRequest.dataReady, а потом другим способом - внутри прототипа, с нижним подчёркиванием в начале (кстати что оно означает, для чего служит, и что если без него?): _dataReady: function(text, js) {} Как я понял, переопределяем методы через прототип для того, чтобы потом можно было создавать экземпляры JSHttpRequest, верно? Т.к. если определить просто по типу JSHttpRequest.dataReady, то этот метод присобачится именно к этому конкретному JSHttpRequest, а к его клонам - уже нет? |
| Автор: Sardar 24.1.2006, 00:56 |
| Идея была в том что бы скрыть некоторые локальные переменные "класса", как бы сделать их приватными. Также обойти в ИЕ утечку памяти при использовании closures, хотя именно в примере её не будет, но это не весь код. JSHttpRequest.dataReady это поле функции (closure) JSHttpRequest, а _dataReady это поле обьектов порождённых от JSHttpRequest, т.е. совершенно разные вещи |
| Автор: Иль 24.1.2006, 11:49 | ||
Там говорится про перегрузку методов - нет её в JavaScript. Там не перегрузка а переопределение методов |
| Автор: regis 20.2.2006, 15:10 |
| Sardar, спасибо большое! Попробую разобраться с JS на досуге... |
| Автор: dm9 19.3.2006, 22:30 |
| Я прочитал - всё понятно, большое спасибо. Правда, я читаю это после котеровских набл, так что пошло достаточно легко Например, call(), apply(), arguments, .caller, .callee. О таких вещах узнаёшь как-то случайно, из статей, из обсуждений - сами авторы считают их вещью всем известной и очевидной. Котеров, например, пишет про основы Ява-Скрипта, и считает, что читатель знаком с apply и call. Странно это... (Не наезд, всем авторам в любом случае большое спасибо - это так, пожелание). |
| Автор: Ciber SLasH 19.3.2006, 23:44 |
| [offtop] dm9, а ты качни справочник по JS в моей подписи, и будешь знать какие методы есть у тех или иных объектах (в догонку ещё и WDH не мешало бы скачать). [/offtop] |
| Автор: Sardar 20.3.2006, 01:19 | ||
| Сразу забудь тогда про IE5.0- , этот зверь не поддерживает ничего из JS, по сути это почти VBS с изменённым синтаксисом, такой же уровень гибкости. .caller трогать нельзя, теоретической основы под этим не помню, но в JS1.5 (все современные браузеры) он deprecated arguments это весьма логичный способ подойти к аргументам функции, у которой их может быть сколько угодно. Также для простоты забросили туда и остальную инфу типа callee. Жаль что это обьект, а не Array, не хватает многих функций (map, filter и т.д.), которые сами вешаем (камень в огород ECMA) на прототип Array. call и apply выполняют одно и тоже - вызывают функцию в контексте обьекта, только способ передачи аргументов разный. Что бы это понять и грамотно заюзать, потребуеться серьёзно упроситься от классического ООП. Развёртка аргументов круче в Python, хватило бы тогда и одной call функции. В Fortress лучше сделан реверанс в сторону фанатов ООП, которые не всегда понимают "этот метод может быть методом любого обьекта и изменяться динамически". Множества "операций" traits по моему очень красиво и эффективно. По поводу использования, обычно народ решает задачи "привычными" методами, мне например проще так:
Вместо удержания моря глобальных массивов (регистров) или собирать "классы". Как видно, даже самая простая задача не обходиться без расширения интерфейса стандартных обьектов, в частности массива... и очень не хватает человеческого списка, хештаблицы, карты(любой обьект, любой обьект) и многих других вещей. Порой думаю что за это растрелял бы парней ECMA... P.S. глянул на пост, больше критики на JS чем ожидал... |
| Автор: dm9 20.3.2006, 03:11 | ||
| В примере разобрался, спасибо! Вот это, конечно, для меня странно function colorFade() colorFade.handles={}; colorFade.resolution = 50; То есть код я понимаю, но я бы стал "собирать класс"... Интересное применение. Буду осознавать
Скажи, а не существует таких библиотек, которые это всё реализуют? Наверняка кто-то пытался собрать этакий STL для JS. |
| Автор: Ciber SLasH 20.3.2006, 03:13 |
| Sardar, я снимаю перед тобой шляпу. Мне бы так научиться жонглировать в скриптах. Я посмотрел код, разобрался, понял реализацию, но до меня не доходит сам алгоритм работы colorFade-а. Не мог бы ты описать сам алгоритм? |
| Автор: dm9 20.3.2006, 03:42 | ||
| Давай я попробую
|
| Автор: Ciber SLasH 20.3.2006, 05:54 |
| dm9, спасибо за разжовывание. В принципе меня интересовал только сам механизм смены цветов. |
| Автор: Sardar 20.3.2006, 11:35 | ||||
| colorFade.handles={}; - в JS нет человеческой карты обьект=>обьект, потому пользуемся обьектом как хештаблицей. Сохраняем таймеры в общем регистре, что бы потом можно было остановить если человек нескольк раз нажмёт на кнопку. colorFade.resolution = 50; - это конфигурационная переменная, одна на все fade. Да можно было сделать некий класс, возможно даже singleton, но в JS мне так проще. В PHP5 или в Java уже классами.
Не совсем, это идентификатор для карты handles, где храним таймеры. Но карт в JS нет, это обьект, а обьект имеет стандартный интерфейс. Таким образом ключь toString и прочие будут перезаписывать совсем не то что ты хотел. В итоге лучше "обезоапсить" добавив тильду, т.к. ни одно поле у обьекта с тильды не начинаеться. Не красивый, но рабочий хак...
Угу, пример накатал за 15 минут для поста, ночью, была заморочка с "дёрганьем цветов" если от c colorfrom, разбираться не хотел и попросту схалтурил Отсюда можно вывести два понятия что люди часто путают: выразительность и читабельность языка. Выразительность это то, на сколько просто языком описать свою мысль/идею, либо это пара строк кода, либо 100кб в куче файлов. Читабельность это простота восприятия синтаксиса, не каждый новичёк считает тернарный оператор ?: хорошо читаемым, в то же время он очень выразителен. Самые читабельные по моему паскалеподобные языки, самые выразительные функциональные и ООП (Java и C#, a C++ пусть идёт лесом). Чем выше уровень программиста, тем больше потребность именно в выразительности. ИМХО JS'у не хватает выразительности, это красивый и мощный язык, но имплементируя его я бы пошёл дальше ECMA. Если откинуть прямую "обьектность" то легко можно распараллелить исполнение (хотя это будет уже не JS...), натолкнуло http://lisp2d.crimeastar.net/ Ciber SLasH, ничего в алгоритме нету |
| Автор: dm9 20.3.2006, 12:23 | ||
А всё-таки... немного оффтоп, конечно, но тут вся тема - оффтоп
Интересны не отдельные разработки "по мелочам", а именно попытка собрать всё в один пакет. |
| Автор: Sardar 20.3.2006, 12:52 | ||
Лишний вес по сути Посмотри что я писал для этой шкурки форума, MyLib.js, там доведение до ума интерфейса Array, addEventListener и прочее. Только то что использовал, то и осталось. Видел либы для анимаций и эфефктов, дахзе сам писал, но как то в реальной жизни не требуеться. Да и написать это всё по новой просто, скрипты ведь. Угу, думал как это всё аккуратно вырезать в отдельную тему, от работы в мыслях хаос, почищю топ позже |
| Автор: elferno 31.8.2007, 15:53 |
| я похоже слишком примитивный чтобы понять концеп прототипного JS, Вы не могли бы, пожалуйсто, ответить: 1. зачем вообще применять такую модель. 2. если я все пишу примитивным способом: document.getElementById("my_element").innerHTML='123'; вместо inner='123'; document.getElementById("my_element").appendChild(inner); //вроде как-то так то каким образом мне сейчас лучше поступить? заранее спасибо. P.S. был бы весьма признателен получив Ваш ответ в ICQ на номер 282-897-997 |
| Автор: cruelangel 12.9.2007, 22:43 |
| >во многих языках есть понятие полей обьекта, при изменении которого вызывается функция обработчик(т.н. get/set функции). их правильнее называть свойствами, а поля - это просто хранилище данных безо всяких геттеров и сеттеров |